diff --git a/.travis.yml b/.travis.yml index 6e3903def..210e9b780 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,10 @@ compiler: clang before_install: - echo 'yes' | sudo add-apt-repository ppa:mapnik/boost - sudo apt-get update -qq - - sudo apt-get install -qq libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-system-dev libboost-thread-dev python-nose libicu-dev libpng-dev libjpeg-dev libtiff-dev libz-dev libfreetype6-dev libxml2-dev libproj-dev + - sudo apt-get install -qq libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-system-dev libboost-thread-dev python-nose libicu-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev libz-dev libfreetype6-dev libxml2-dev libproj-dev script: - - ./configure DEMO=False BINDINGS='python' CPP_TESTS=False CAIRO=False INPUT_PLUGINS='' OPTIMIZATION=1 JOBS=2 FAST=True && make + - ./configure DEMO=False BINDINGS='python' CPP_TESTS=False CAIRO=False INPUT_PLUGINS='' OPTIMIZATION=1 FAST=True && JOBS=2 make branches: only: diff --git a/CHANGELOG.md b/CHANGELOG.md index 33f5109e8..278204bb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,84 @@ For a complete change history, see the git log. ## Future -- Changed scale_denominator C++ interface to take scale as first argument rather than map. +- Added to python bindings: `has_tiff`, `has_png`, `has_webp`, `has_proj4`, `has_svg_renderer`, and `has_grid_renderer` -- Added support for `background-image` in cairo_renderer (#1724) +- Made it possible to disable compilation of `grid_renderer` with `./configure GRID_RENDERER=False` (#1962) + +- Added `webp` image encoding and decoding support (#1955) + +- Added `premultiplied` property on mapnik::image_32 / mapnik.Image to enable knowledge of premultiplied status of image buffer. + +- Added `scale-hsla` image-filter that allows scaling colors in HSL color space. RGB is converted to HSL (hue-saturation-lightness) and then each value (and the original alpha value) is stretched based on the specified scaling values. An example syntax is `scale-hsla(0,1,0,1,0,1,0,1)` which means no change because the full range will be kept (0 for lowest, 1 for highest). Other examples are: 1) `scale-hsla(0,0,0,1,0,1,0,1)` which would force all colors to be red in hue in the same way `scale-hsla(1,1,0,1,0,1,0,1)` would, 2) `scale-hsla(0,1,1,1,0,1,0,1)` which would cause all colors to become fully saturated, 3) `scale-hsla(0,1,1,1,0,1,.5,1)` which would force no colors to be any more transparent than half, and 4) `scale-hsla(0,1,1,1,0,1,0,.5)` which would force all colors to be at least half transparent. (#1954) + +## 2.2.0 + +Released June 3rd, 2013 + +(Packaged from 9231205) + +Summary: The 2.2.0 release is primarily a performance and stability release. The code line represents development in the master branch since the release of 2.1.0 in Aug 2012 and therefore includes nearly a year of bug-fixes and optimizations. Nearly 500 new tests have been added bring the total coverage to 925. Shapefile and PostGIS datasources have benefited from numerous stability fixes, 64 bit integer support has been added to support OSM data in the grid renderer and in attribute filtering, and many fixes have landed for higher quality output when using a custom `scale_factor` during rendering. Critical code paths have been optimized include raster rendering, xml map loading, string to number conversion, vector reprojection when using `epsg:4326` and `epsg:3857`, `hextree` encoding, halo rendering, and rendering when using a custom `gamma`. Mapnik 2.2 also compiles faster than previous releases in the 2.x series and drops several unneeded and hard to install dependencies making builds on OS X and Windows easier than any previous release. + +- Removed 3 depedencies without loosing any functionality: `ltdl`, `cairomm` and `libsigc++` (#1804,#806,#1681) + +- Added 64 bit integer support in expressions, feature ids, and the grid_renderer (#1661,#1662,#1662) + +- Added the ability to disable the need for various dependencies: `proj4`, `libpng`, `libtiff`, `libjpeg` + +- Added faster reprojection support between `epsg:3857` and `epsg:4326` (#1705,#1703,#1579) + +- Fixed concurrency problem when using cursors in postgis plugin (#1823,#1588) + +- Fixed postgres connection pool leaks when using `persist_connection=false` (#1764) + +- Fixed postgres connection key to respect highest value of `max_size` and `initial_size` for any layer in map (#1599) + +- Fixed potential crash in wkb parsing when postgis returns null geometry (#1843) + +- Fixed blurry rendering of image and SVG icons (#1316) + +- Added detection of invalid srs values when loading xml (#646) + +- Added support for specifying a base_path as a third, optional argument to load_xml + +- Removed muffling of projection errors while rendering (#646) + +- Improved logging system (https://github.com/mapnik/mapnik/wiki/Logging) + +- Added support for reading images from in memory streams (#1805) + +- Optimized halo rendering. When halo radius is < 1 new method will be used automatically (#1781) + +- Added `text-halo-rasterizer` property. Set to `fast` for lower quality but faster + halo rendering (#1298) which matched new default method when radius is < 1. + +- Added support in `shape`, `sqlite`, `geojson`, and `csv` plugin for handling non-latin characters in the paths to file-based resources (#1177) + +- Fixed rendering of markers when their size is greater than the specified `spacing` value (#1487) + +- Fixed handling of alpha premultiplication in image scaling (#1489) + +- Optimized rendering when a style with no symbolizers is encountered (#1517) + +- Optimized string handling and type conversion by removing `boost::to_lower`, `boost::trim`, and `boost::lexical_cast` usage (#1687,#1687,#1633) + +- Optimized alpha preserving `hextree` method for quantization of png images (#1629) + +- Faster rendering of rasters by reducing memory allocation of temporary buffers (#1516) + +- Fixed some raster reprojection artifacts (#1501) + +- Fixed raster alignment when width != height and raster is being scaled (#1748,#1622) + +- Added support for caching rasters for re-use during rendering when styling more than once per layer (#1543) + +- Improved compile speeds of the code - in some cases by up to 2x and removed need for freetype dependency when building code against mapnik (#1688, #1756) + +- Removed internal rule cache on `mapnik::Map` c++ object (#1723) + +- Improved the scaled rendering of various map features when using `scale_factor` > 1 (#1280,#1100,#1273,#1792,#1291,#1344,#1279,#1624,#1767,#1766) + +- Added C++ api for overriding scale_denominator to enable rendering at fixed scale (#1582) - Added Layer `buffer-size` that can be used to override Map `buffer-size` to avoid over-fetching of data that does not need to be buffered as much as other layers. @@ -18,13 +93,49 @@ For a complete change history, see the git log. previously undocumented parameter by the same name that impacted clipping extent and was not needed (clipping padding should likely be a symbolizer level option) (#1566) -- Fixed building symbolizer rendering to be fully sensitive to alpha (8b66128c892 / bc8ea1c5a7a) +- Fixed potential file descriptor leaks in image readers when invalid images were encountered (#1783) -- Added 64 bit integer support in the grid_renderer (#1662) +- Fixed alpha handling in the `blur` and `invert` image filters (#1541) + +- Fixed error reporting in the python plugin (#1422) + +- Added the ability to run tests without installing with `make test-local` + +- Reduced library binary size by adding support for `-fvisibility-inlines-hidden` and `-fvisibility=hidden` (#1826,#1832) + +- Added `mapnik::map_request` class, a special object to allow passing mutable map objects to renderer (#1737) + +- Added the ability to use `boost::hash` on `mapnik::value` types (#1729) + +- Removed obsolete `geos` plugin (functionality replaced by `csv` plugin) and unmaintained `kismet` plugin (#1809,#1833) + +- Added new `mapnik-config` flags: `--all-flags`, `--defines`, `--git-describe`, `--includes`, `--dep-includes`, `--cxxflags`, `--cxx` (#1443) + +- Added support for unicode strings as arguments in python bindings (#163) + +- Added DebugSymbolizer which is able to render the otherwise invisible collision boxes (#1366) + +- Optimized rendering by reducing overhead of using `gamma` property (#1174) + +- Fixed rendering artifacts when using `polygon-gamma` or `line-gamma` equal to 0 (#761,#1763) + +- Fixed and optimized the display of excessive precision of some float data in labels (#430,#1697) + +- Removed the `bind` option for datasources (#1654) + +- Added ability to access style list from map by (name,obj) in python (#1725) + +- Added `is_solid` method to python mapnik.Image and mapnik.ImageView classes (#1728) + +- Changed scale_denominator C++ interface to take scale as first argument rather than map. + +- Added support for `background-image` in cairo_renderer (#1724) + +- Fixed building symbolizer rendering to be fully sensitive to alpha (8b66128c892 / bc8ea1c5a7a) - `[attr]` now returns false if attr is an empty string (#1665) -- Added 64 bit integer support in expressions and feature ids (#1661,#1662) +- `[attr]!=null` now returns true if attr is not null (#1642) - Added support for DBF `Logical` type: #1614 @@ -41,9 +152,7 @@ For a complete change history, see the git log. - Added support for setting zlib `Z_FIXED` strategy with format string: `png:z=fixed` -- Fixed handling of transparency level option in Octree-based PNG encoding (#1556) - -- Faster rendering of rasters by reducing memory allocation of temporary buffers (#1516) +- Fixed handling of transparency level option in `octree` png encoding (#1556) - Added ability to pass a pre-created collision detector to the cairo renderer (#1444) @@ -59,6 +168,24 @@ For a complete change history, see the git log. now the combined layer extents will be again respected: they will be clipped to the maximum-extent if possible and only when back-projecting fails for all layers will the maximum-extent be used as a fallback (#1473) +- Compile time flag called `PLUGIN_LINKING` to allow input datasource plugins to be statically linked with the mapnik library (#249) + +- Fixed `dasharray` rendering in cairo backend (#1740) + +- Fixed handling of `opacity` in svg rendering (#1744) + +- Fixed uneven rendering of markers along lines (#1693) + +- Fixed handling of extra bytes in some shapefile fields (#1605) + +- Fixed handling (finally) of null shapes and partially corrupt shapefiles (#1630,#1621) + +- Added ability to re-use `mapnik::image_32` and `mapnik::grid` by exposing a `clear` method (#1571) + +- Added support for writing RGB (no A) png images by using the format string of `png:t=0` (#1559) + +- Added experimental support for geometry simplification at symbolizer level (#1385) + ## Mapnik 2.1.0 Released Aug 23, 2012 @@ -119,7 +246,7 @@ Released Aug 23, 2012 - Improved logging/debugging system with release logs and file redirection (https://github.com/mapnik/mapnik/wiki/Runtime-Logging) (#937 and partially #986, #467) - GDAL: allow setting nodata value on the fly (will override value if nodata is set in data) (#1161) - + - GDAL: respect nodata for paletted/colormapped images (#1160) - PostGIS: Added a new option called `autodetect_key_field` (by default false) that if true will @@ -175,7 +302,7 @@ Released Aug 3, 2012 - Fixed possible breakage registering plugins via python if a custom PREFIX or DESTDIR was used (e.g. macports/homebrew) (#1171) -- Fixed memory leak in the case of proj >= 4.8 and a projection initialization error (#1173) +- Fixed memory leak in the case of proj >= 4.8 and a projection initialization error (#1173) ## Mapnik 2.0.1 @@ -206,7 +333,7 @@ Released April 10, 2012 - Workaround for boost interprocess compile error with recent gcc versions (#950,#1001,#1082) -- Fix possible memory corruption when using hextree mode for png color reduction (#1087) +- Fix possible memory corruption when using `hextree` mode for png color reduction (#1087) - Fixed bug in shield line placement when dx/dy are used to shift the label relative to the placement point (Matt Amos) (#908) @@ -386,14 +513,14 @@ Released March 23, 2010 - PNG: fixed png256 for large images and some improvements to reduce color corruptions ([#522](https://github.com/mapnik/mapnik/issues/522)) -- PNG: Added new quantization method for indexed png format using hextree with full support for alpha +- PNG: Added new quantization method for indexed png format using `hextree` with full support for alpha channel. Also new method has some optimizations for color gradients common when using elevation based - rasters. By default old method using octree is used. (r1680, r1683, [#477](https://github.com/mapnik/mapnik/issues/477)) + rasters. By default old method using `octree` is used. (r1680, r1683, [#477](https://github.com/mapnik/mapnik/issues/477)) - PNG: Added initial support for passing options to png writter like number of colors, transparency support, quantization method and possibly other in future using type parameter. For example "png8:c=128:t=1:m=h" limits palette to 128 colors, uses only binary transparency (0 - none, - 1 - binary, 2 - full), and new method of quantization using hextree (h - hextree, o - octree). + 1 - binary, 2 - full), and new method of quantization using `hextree` (h - `hextree`, o - `octree`). Existing type "png256" can be also written using "png8:c=256:m=o:t=2" (r1680, r1683, [#477](https://github.com/mapnik/mapnik/issues/477)) diff --git a/COPYING b/COPYING index cfe59bcad..e5ab03e12 100644 --- a/COPYING +++ b/COPYING @@ -1,8 +1,8 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -10,7 +10,7 @@ as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a @@ -111,8 +111,8 @@ modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE + + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other @@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an @@ -158,7 +158,7 @@ Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 @@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. @@ -267,7 +267,7 @@ Library will still fall under Section 6.) distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work @@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined @@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or @@ -422,7 +422,7 @@ conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is @@ -432,7 +432,7 @@ decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. @@ -455,8 +455,8 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS - + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest @@ -485,7 +485,7 @@ convey the exclusion of warranty; and each file should have at least the 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. diff --git a/INSTALL.md b/INSTALL.md index f3b715d48..e7b2aeddd 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -7,7 +7,7 @@ To configure and build Mapnik do: ./configure make -NOTE: the above will not work on windows, rather see https://github.com/mapnik/mapnik/wiki/BuildingOnWindows +NOTE: the above will not work on windows, rather see https://github.com/mapnik/mapnik/wiki/WindowsInstallation Then to run the tests locally (without needing to install): @@ -48,27 +48,33 @@ Mapnik Core depends on: - 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 - * libpng >= 1.2.x - PNG graphics - * libjpeg - JPEG graphics - * libtiff - TIFF graphics * libz - Zlib compression * libfreetype - Freetype2 for font support (Install requires freetype-config) * libxml2 - XML parsing (Install requires xml2-config) - * libproj - PROJ.4 projection library + +Mapnik Core optionally depends on: + + * libpng >= 1.2.x - PNG graphics (Default enabled, if found) + * libjpeg - JPEG graphics (Default enabled, if found) + * libtiff - TIFF graphics (Default enabled, if found) + * 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 -Note: Python3k is supported, see: https://github.com/mapnik/mapnik/wiki/Python3k +Note: Python 3.x is supported, see: https://github.com/mapnik/mapnik/wiki/Python3k -Optional dependencies: +Additional optional dependencies: - * Cairo - Graphics library for output formats like PDF, PS, and SVG + * 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 - * libpq - PostgreSQL libraries (For PostGIS plugin support) + * PostgreSQL (for PostGIS plugin support) + - libpq - PostreSQL libraries + - pg_config - PostgreSQL installation capabilities * libgdal - GDAL/OGR input (For gdal and ogr plugin support) * libsqlite3 - SQLite input (needs RTree support builtin) (sqlite plugin support) * libocci - Oracle input plugin support diff --git a/Makefile b/Makefile index 87964840d..8c05035d5 100755 --- a/Makefile +++ b/Makefile @@ -5,16 +5,28 @@ ifeq ($(UNAME), Darwin) else endif +OS:=$(shell uname -s) + +ifeq ($(JOBS),) + JOBS:=1 + ifeq ($(OS),Linux) + JOBS:=$(shell grep -c ^processor /proc/cpuinfo) + endif + ifeq ($(OS),Darwin) + JOBS:=$(shell sysctl -n hw.ncpu) + endif +endif + all: mapnik install: - @python scons/scons.py --config=cache --implicit-cache --max-drift=1 install + @python scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1 install mapnik: - @python scons/scons.py --config=cache --implicit-cache --max-drift=1 + @python scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1 clean: - @python scons/scons.py -c --config=cache --implicit-cache --max-drift=1 + @python scons/scons.py -j$(JOBS) -c --config=cache --implicit-cache --max-drift=1 @if test -e ".sconsign.dblite"; then rm ".sconsign.dblite"; fi @if test -e "config.log"; then rm "config.log"; fi @if test -e ".sconf_temp/"; then rm -r ".sconf_temp/"; fi @@ -34,7 +46,7 @@ rebuild: make uninstall && make clean && time make && make install uninstall: - @python scons/scons.py --config=cache --implicit-cache --max-drift=1 uninstall + @python scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1 uninstall test: @ ./run_tests @@ -42,6 +54,7 @@ test: test-local: @echo "*** Boostrapping local test environment..." @export ${LINK_FIX}=`pwd`/src:${${LINK_FIX}} && \ + export PATH=`pwd`/utils/mapnik-config/:${PATH} && \ export PYTHONPATH=`pwd`/bindings/python/:${PYTHONPATH} && \ export MAPNIK_FONT_DIRECTORY=`pwd`/fonts/dejavu-fonts-ttf-2.33/ttf/ && \ export MAPNIK_INPUT_PLUGINS_DIRECTORY=`pwd`/plugins/input/ && \ @@ -55,7 +68,7 @@ check: test-local demo: @echo "*** Running rundemo.cpp…" - cd demo/c++; ./rundemo `mapnik-config --prefix`/lib/mapnik + cd demo/c++; ./rundemo `mapnik-config --prefix` pep8: # https://gist.github.com/1903033 diff --git a/README.md b/README.md index 835152ff2..7ddca1790 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,4 @@ See [INSTALL.md](https://github.com/mapnik/mapnik/blob/master/INSTALL.md) for in # License -Mapnik software is free and is released under LGPL ([GNU Lesser General Public License](http://www.gnu.org/licenses/lgpl.html_). Please see [COPYING](https://github.com/mapnik/mapnik/blob/master/COPYING) for more information. +Mapnik software is free and is released under LGPL ([GNU Lesser General Public License](http://www.gnu.org/licenses/lgpl.html_)). Please see [COPYING](https://github.com/mapnik/mapnik/blob/master/COPYING) for more information. diff --git a/SConstruct b/SConstruct index ad51f5f9e..40b9ff277 100644 --- a/SConstruct +++ b/SConstruct @@ -22,6 +22,7 @@ import sys import re import platform from glob import glob +from copy import copy from subprocess import Popen, PIPE from SCons.SConf import SetCacheMode import pickle @@ -35,6 +36,12 @@ except: LIBDIR_SCHEMA_DEFAULT='lib' severities = ['debug', 'warn', 'error', 'none'] +DEFAULT_CC = "gcc" +DEFAULT_CXX = "g++" +if sys.platform == 'darwin': + DEFAULT_CC = "clang" + DEFAULT_CXX = "clang++" + py3 = None # local file to hold custom user configuration variables @@ -55,30 +62,29 @@ 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', + 'ociei':'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', - 'geos_c':'GEOS Simple Geometry Specification C Library | configured with GEOS_LIB & GEOS_INCLUDE | more info: https://github.com/mapnik/mapnik/wiki//GEOS', + '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', - 'sqlite3':'SQLite3 C Library | configure with SQLITE_LIBS & SQLITE_INCLUDES | more info: https://github.com/mapnik/mapnik/wiki//SQLite', + 'pg':'Postgres C Library required for PostGIS plugin | configure with pg_config program | 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', 'png':'PNG C library | configure with PNG_LIBS & PNG_INCLUDES', + '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/', - 'ltdl':'GNU Libtool | more info: http://www.gnu.org/software/libtool', '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', 'gdal-config':'gdal-config program | try setting GDAL_CONFIG SCons option', - 'geos-config':'geos-config program | try setting GEOS_CONFIG SCons option', 'freetype-config':'freetype-config program | try setting FREETYPE_CONFIG SCons option', - 'osm':'more info: https://github.com/mapnik/mapnik/wiki//OsmPlugin', - 'curl':'libcurl is required for the "osm" plugin - more info: https://github.com/mapnik/mapnik/wiki//OsmPlugin', + 'osm':'more info: https://github.com/mapnik/mapnik/wiki/OsmPlugin', + 'curl':'libcurl is required for the "osm" plugin - 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)', 'pgsql2sqlite_rtree':'The pgsql2sqlite program requires libsqlite3 built with RTREE support (-DSQLITE_ENABLE_RTREE=1)' @@ -91,22 +97,20 @@ PLUGINS = { # plugins with external dependencies 'postgis': {'default':True,'path':None,'inc':'libpq-fe.h','lib':'pq','lang':'C'}, '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++'}, - 'geos': {'default':False,'path':None,'inc':'geos_c.h','lib':'geos_c','lang':'C'}, # configured with custom paths, hence 'path': PREFIX/INCLUDES/LIBS 'occi': {'default':False,'path':'OCCI','inc':'occi.h','lib':'ociei','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'}, # todo: osm plugin does also depend on libxml2 (but there is a separate check for that) - 'osm': {'default':True,'path':None,'inc':'curl/curl.h','lib':'curl','lang':'C'}, + 'osm': {'default':False,'path':None,'inc':'curl/curl.h','lib':'curl','lang':'C'}, # plugins without external dependencies requiring CheckLibWithHeader... 'shape': {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'}, '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++'}, - 'kismet': {'default':False,'path':None,'inc':None,'lib':None,'lang':'C++'}, - 'python': {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'}, + 'python': {'default':False,'path':None,'inc':None,'lib':None,'lang':'C++'}, } @@ -170,10 +174,14 @@ def shortest_name(libs): name = lib return name +def rm_path(item,set,_env): + for i in _env[set]: + if item in i: + _env[set].remove(i) def sort_paths(items,priority): """Sort paths such that compiling and linking will globally prefer custom or local libs - over system libraries by fixing up the order libs are passed to gcc and the linker. + over system libraries by fixing up the order libs are passed to the compiler and the linker. Ideally preference could be by-target instead of global, but our SCons implementation is not currently utilizing different SCons build env()'s as we should. @@ -243,7 +251,7 @@ def pretty_dep(dep): if pretty: return '%s (%s)' % (dep,pretty) elif 'boost' in dep: - return '%s (%s)' % (dep,'more info see: https://github.com/mapnik/mapnik/wiki//MapnikInstallation & http://www.boost.org') + return '%s (%s)' % (dep,'more info see: https://github.com/mapnik/mapnik/wiki/Mapnik-Installation & http://www.boost.org') return dep @@ -258,14 +266,15 @@ opts = Variables() opts.AddVariables( # Compiler options - ('CXX', 'The C++ compiler to use to compile mapnik (defaults to g++).', 'g++'), - ('CC', 'The C compiler used for configure checks of C libs (defaults to gcc).', 'gcc'), + ('CXX', 'The C++ compiler to use to compile mapnik', DEFAULT_CXX), + ('CC', 'The C compiler used for configure checks of C libs.', DEFAULT_CC), ('CUSTOM_CXXFLAGS', 'Custom C++ flags, e.g. -I if you have headers in a nonstandard directory ', ''), + ('CUSTOM_DEFINES', 'Custom Compiler DEFINES, e.g. -DENABLE_THIS', ''), ('CUSTOM_CFLAGS', 'Custom C flags, e.g. -I if you have headers in a nonstandard directory (only used for configure checks)', ''), ('CUSTOM_LDFLAGS', 'Custom linker flags, e.g. -L if you have libraries in a nonstandard directory ', ''), EnumVariable('LINKING', "Set library format for libmapnik",'shared', ['shared','static']), EnumVariable('RUNTIME_LINK', "Set preference for linking dependencies",'shared', ['shared','static']), - EnumVariable('OPTIMIZATION','Set g++ optimization level','3', ['0','1','2','3','4','s']), + EnumVariable('OPTIMIZATION','Set compiler optimization level','3', ['0','1','2','3','4','s']), # Note: setting DEBUG=True will override any custom OPTIMIZATION level BoolVariable('DEBUG', 'Compile a debug version of Mapnik', 'False'), BoolVariable('DEBUG_UNDEFINED', 'Compile a version of Mapnik using clang/llvm undefined behavior asserts', 'False'), @@ -273,6 +282,7 @@ opts.AddVariables( ('WARNING_CXXFLAGS', 'Compiler flags you can set to reduce warning levels which are placed after -Wall.', ''), # SCons build behavior options + ('HOST', 'Set the target host for cross compiling"', ''), ('CONFIG', "The path to the python file in which to save user configuration options. Currently : '%s'" % SCONS_LOCAL_CONFIG,SCONS_LOCAL_CONFIG), BoolVariable('USE_CONFIG', "Use SCons user '%s' file (will also write variables after successful configuration)", 'True'), # http://www.scons.org/wiki/GoFastButton @@ -305,10 +315,8 @@ opts.AddVariables( ('XML2_CONFIG', 'The path to the xml2-config executable.', 'xml2-config'), PathVariable('ICU_INCLUDES', 'Search path for ICU include files', '/usr/include', PathVariable.PathAccept), PathVariable('ICU_LIBS','Search path for ICU include files','/usr/' + LIBDIR_SCHEMA_DEFAULT, PathVariable.PathAccept), - ('ICU_LIB_NAME', 'The library name for icu (such as icuuc, sicuuc, or icucore)', 'icuuc', -PathVariable.PathAccept), - PathVariable('LTDL_INCLUDES', 'Search path for libltdl (part of libtool) include files', '/usr/include', PathVariable.PathAccept), - PathVariable('LTDL_LIBS','Search path for libltdl (ltdl.h) library files','/usr/' + LIBDIR_SCHEMA_DEFAULT, PathVariable.PathAccept), + ('ICU_LIB_NAME', 'The library name for icu (such as icuuc, sicuuc, or icucore)', 'icuuc', PathVariable.PathAccept), + BoolVariable('PNG', 'Build Mapnik with PNG read and write support', 'True'), PathVariable('PNG_INCLUDES', 'Search path for libpng include files', '/usr/include', PathVariable.PathAccept), PathVariable('PNG_LIBS','Search path for libpng library files','/usr/' + LIBDIR_SCHEMA_DEFAULT, PathVariable.PathAccept), @@ -318,6 +326,9 @@ PathVariable.PathAccept), BoolVariable('TIFF', 'Build Mapnik with TIFF read and write support', 'True'), PathVariable('TIFF_INCLUDES', 'Search path for libtiff include files', '/usr/include', PathVariable.PathAccept), PathVariable('TIFF_LIBS', 'Search path for libtiff library files', '/usr/' + LIBDIR_SCHEMA_DEFAULT, PathVariable.PathAccept), + BoolVariable('WEBP', 'Build Mapnik with WEBP read', 'True'), + PathVariable('WEBP_INCLUDES', 'Search path for libwebp include files', '/usr/include', PathVariable.PathAccept), + PathVariable('WEBP_LIBS','Search path for libwebp library files','/usr/' + LIBDIR_SCHEMA_DEFAULT, PathVariable.PathAccept), 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), @@ -325,13 +336,12 @@ PathVariable.PathAccept), # Variables affecting rendering back-ends - BoolVariable('RENDERING_STATS', 'Output rendering statistics during style processing', 'False'), - + BoolVariable('GRID_RENDERER', 'build support for native grid renderer', 'True'), BoolVariable('SVG_RENDERER', 'build support for native svg renderer', 'False'), BoolVariable('CPP_TESTS', 'Compile the C++ tests', 'True'), + BoolVariable('BENCHMARK', 'Compile the C++ benchmark scripts', 'False'), # Variables for optional dependencies - ('GEOS_CONFIG', 'The path to the geos-config executable.', 'geos-config'), # Note: cairo and and pycairo are optional but configured automatically through pkg-config # Therefore, we use a single boolean for whether to attempt to build cairo support. BoolVariable('CAIRO', 'Attempt to build with Cairo rendering support', 'True'), @@ -349,7 +359,10 @@ PathVariable.PathAccept), # Variables for logging and statistics BoolVariable('ENABLE_LOG', 'Enable logging, which is enabled by default when building in *debug*', 'False'), BoolVariable('ENABLE_STATS', 'Enable global statistics during map processing', 'False'), - ('DEFAULT_LOG_SEVERITY', 'The default severity of the logger (eg. ' + ', '.join(severities), 'error'), + ('DEFAULT_LOG_SEVERITY', 'The default severity of the logger (eg. ' + ', '.join(severities) + ')', 'error'), + + # Plugin linking + EnumVariable('PLUGIN_LINKING', "Set plugin linking with libmapnik", 'shared', ['shared','static']), # Other variables BoolVariable('SHAPE_MEMORY_MAPPED_FILE', 'Utilize memory-mapped files in Shapefile Plugin (higher memory usage, better performance)', 'True'), @@ -366,6 +379,8 @@ PathVariable.PathAccept), ('JOBS', 'Set the number of parallel compilations', "1", lambda key, value, env: int(value), int), BoolVariable('DEMO', 'Compile demo c++ application', 'True'), BoolVariable('PGSQL2SQLITE', 'Compile and install a utility to convert postgres tables to sqlite', 'False'), + BoolVariable('SHAPEINDEX', 'Compile and install a utility to generate shapefile indexes in the custom format (.index) Mapnik supports', 'True'), + BoolVariable('SVG2PNG', 'Compile and install a utility to generate render an svg file to a png on the command line', 'False'), 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'), @@ -386,6 +401,7 @@ pickle_store = [# Scons internal variables 'LIBS', 'LINKFLAGS', 'CUSTOM_LDFLAGS', # user submitted + 'CUSTOM_DEFINES', # user submitted 'CUSTOM_CXXFLAGS', # user submitted 'CUSTOM_CFLAGS', # user submitted 'MAPNIK_LIB_NAME', @@ -395,6 +411,7 @@ pickle_store = [# Scons internal variables 'PLUGINS', 'ABI_VERSION', 'MAPNIK_VERSION_STRING', + 'MAPNIK_VERSION', 'PLATFORM', 'BOOST_ABI', 'BOOST_APPEND', @@ -426,14 +443,17 @@ pickle_store = [# Scons internal variables 'MAPNIK_LIB_BASE_DEST', 'EXTRA_FREETYPE_LIBS', 'LIBMAPNIK_CPPATHS', + 'LIBMAPNIK_DEFINES', 'LIBMAPNIK_CXXFLAGS', 'CAIRO_LIBPATHS', - 'CAIRO_LINKFLAGS', + 'CAIRO_ALL_LIBS', 'CAIRO_CPPPATHS', + 'GRID_RENDERER', 'SVG_RENDERER', 'SQLITE_LINKFLAGS', 'BOOST_LIB_VERSION_FROM_HEADER', - 'BIGINT' + 'BIGINT', + 'HOST' ] # Add all other user configurable options to pickle pickle_store @@ -454,7 +474,7 @@ HELP_REQUESTED = False if ('-h' in command_line_args) or ('--help' in command_line_args): HELP_REQUESTED = True -if ('-c' in command_line_args) or ('--clean' in command_line_args): +if ('install' not in command_line_args) and ('-c' in command_line_args) or ('--clean' in command_line_args): HELP_REQUESTED = True if 'configure' in command_line_args and not HELP_REQUESTED: @@ -546,7 +566,7 @@ def parse_config(context, config, checks='--libs --cflags'): env = context.env tool = config.lower().replace('_','-') toolname = tool - if config in ('GDAL_CONFIG','GEOS_CONFIG'): + if config in ('GDAL_CONFIG'): toolname += ' %s' % checks context.Message( 'Checking for %s... ' % toolname) cmd = '%s %s' % (env[config],checks) @@ -575,7 +595,7 @@ def parse_config(context, config, checks='--libs --cflags'): ret = False print ' (xml2-config not found!)' if not parsed: - if config in ('GDAL_CONFIG','GEOS_CONFIG'): + if config in ('GDAL_CONFIG'): # optional deps... env['SKIPPED_DEPS'].append(tool) conf.rollback_option(config) @@ -657,15 +677,16 @@ def update_linux_project_files(): ] def iterate_dirs(headers_content, source_content, d): - for root, subFolders, files in os.walk(d): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - headers_content.append(" ../%s \\" % os.path.join(root, f)) - if f.endswith(".cpp") or f.endswith(".c"): - source_content.append(" ../%s \\" % os.path.join(root, f)) - for sd in subFolders: - headers_content, source_content = \ - iterate_dirs(headers_content, source_content, sd) + if not "uninstall-" in d: + for root, subFolders, files in os.walk(d): + for f in files: + if f.endswith(".h") or f.endswith(".hpp"): + headers_content.append(" ../%s \\" % os.path.join(root, f)) + if f.endswith(".cpp") or f.endswith(".c"): + source_content.append(" ../%s \\" % os.path.join(root, f)) + for sd in subFolders: + headers_content, source_content = \ + iterate_dirs(headers_content, source_content, os.path.join(root, sd)) return headers_content, source_content for d in directories: @@ -722,25 +743,23 @@ def FindBoost(context, prefixes, thread_flag): msg = str() if BOOST_LIB_DIR: - msg += '\n *libs found: %s' % BOOST_LIB_DIR + msg += '\nFound boost libs: %s' % BOOST_LIB_DIR env['BOOST_LIBS'] = BOOST_LIB_DIR else: env['BOOST_LIBS'] = '/usr/' + env['LIBDIR_SCHEMA'] - msg += '\n *using default boost lib dir: %s' % env['BOOST_LIBS'] + msg += '\nUsing default boost lib dir: %s' % env['BOOST_LIBS'] if BOOST_INCLUDE_DIR: - msg += '\n *headers found: %s' % BOOST_INCLUDE_DIR + msg += '\nFound boost headers: %s' % BOOST_INCLUDE_DIR env['BOOST_INCLUDES'] = BOOST_INCLUDE_DIR else: env['BOOST_INCLUDES'] = '/usr/include' - msg += '\n *using default boost include dir: %s' % env['BOOST_INCLUDES'] + msg += '\nUsing default boost include dir: %s' % env['BOOST_INCLUDES'] if not env['BOOST_TOOLKIT'] and not env['BOOST_ABI'] and not env['BOOST_VERSION']: if BOOST_APPEND: - msg += '\n *lib naming extension found: %s' % BOOST_APPEND + msg += '\nFound boost lib name extension: %s' % BOOST_APPEND env['BOOST_APPEND'] = BOOST_APPEND - else: - msg += '\n *no lib naming extension found' else: # Creating BOOST_APPEND according to the Boost library naming order, # which goes ---. See: @@ -755,7 +774,7 @@ def FindBoost(context, prefixes, thread_flag): # Boost libraries. if len(append_params) > 1: env['BOOST_APPEND'] = '-'.join(append_params) - msg += '\n *using boost lib naming: %s' % env['BOOST_APPEND'] + 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'])) @@ -792,6 +811,32 @@ int main() context.Result(ret) return ret +def CheckCairoHasFreetype(context, silent=False): + if not silent: + context.Message('Checking for cairo freetype font support ... ') + context.env.AppendUnique(CPPPATH=copy(env['CAIRO_CPPPATHS'])) + + ret = context.TryRun(""" + +#include + +int main() +{ + #ifdef CAIRO_HAS_FT_FONT + return 0; + #else + return 1; + #endif +} + +""", '.cpp')[0] + if silent: + context.did_show_result=1 + context.Result(ret) + for item in env['CAIRO_CPPPATHS']: + rm_path(item,'CPPPATH',context.env) + return ret + def GetBoostLibVersion(context): ret = context.TryRun(""" @@ -862,8 +907,7 @@ int main() def boost_regex_has_icu(context): if env['RUNTIME_LINK'] == 'static': - context.env.Append(LIBS='icui18n') - context.env.Append(LIBS='icudata') + context.env.AppendUnique(LIBS='icudata') ret = context.TryRun(""" #include @@ -890,7 +934,7 @@ int main() return True return False -def sqlite_has_rtree(context): +def sqlite_has_rtree(context, silent=False): """ check an sqlite3 install has rtree support. PRAGMA compile_options; @@ -927,7 +971,10 @@ int main() } """, '.c') - context.Message('Checking if SQLite supports RTREE... ') + if not silent: + context.Message('Checking if SQLite supports RTREE... ') + if silent: + context.did_show_result=1 context.Result(ret[0]) if ret[0]: return True @@ -939,6 +986,7 @@ conf_tests = { 'prioritize_paths' : prioritize_paths, 'CheckPKGVersion' : CheckPKGVersion, 'FindBoost' : FindBoost, 'CheckBoost' : CheckBoost, + 'CheckCairoHasFreetype' : CheckCairoHasFreetype, 'GetBoostLibVersion' : GetBoostLibVersion, 'GetMapnikLibVersion' : GetMapnikLibVersion, 'parse_config' : parse_config, @@ -1000,12 +1048,14 @@ if not preconfigured: env['SKIPPED_DEPS'] = [] env['HAS_CAIRO'] = False env['CAIRO_LIBPATHS'] = [] - env['CAIRO_LINKFLAGS'] = [] + env['CAIRO_ALL_LIBS'] = [] env['CAIRO_CPPPATHS'] = [] env['HAS_PYCAIRO'] = False env['HAS_LIBXML2'] = False env['LIBMAPNIK_LIBS'] = [] + env['LIBMAPNIK_LINKFLAGS'] = [] env['LIBMAPNIK_CPPATHS'] = [] + env['LIBMAPNIK_DEFINES'] = [] env['LIBMAPNIK_CXXFLAGS'] = [] env['PLUGINS'] = PLUGINS env['EXTRA_FREETYPE_LIBS'] = [] @@ -1065,6 +1115,7 @@ if not preconfigured: env['LIBPATH'] = ['#src'] # set any custom cxxflags and ldflags to come first + env.Append(CPPDEFINES = env['CUSTOM_DEFINES']) env.Append(CXXFLAGS = env['CUSTOM_CXXFLAGS']) env.Append(CFLAGS = env['CUSTOM_CFLAGS']) env.Append(LINKFLAGS = env['CUSTOM_LDFLAGS']) @@ -1081,7 +1132,7 @@ if not preconfigured: SOLARIS = env['PLATFORM'] == 'SunOS' env['SUNCC'] = SOLARIS and env['CXX'].startswith('CC') - # If the Sun Studio C++ compiler (`CC`) is used instead of GCC. + # If the Sun Studio C++ compiler (`CC`) is used instead of gcc. if env['SUNCC']: env['CC'] = 'cc' # To be compatible w/Boost everything needs to be compiled @@ -1098,15 +1149,15 @@ if not preconfigured: # http://www.opensource.apple.com/tarballs/ICU/ # then copy the headers to a location that mapnik will find if 'core' in env['ICU_LIB_NAME']: - env.Append(CXXFLAGS = '-DU_HIDE_DRAFT_API') - env.Append(CXXFLAGS = '-DUDISABLE_RENAMING') + env.Append(CPPDEFINES = '-DU_HIDE_DRAFT_API') + env.Append(CPPDEFINES = '-DUDISABLE_RENAMING') if os.path.exists(env['ICU_LIB_NAME']): #-sICU_LINK=" -L/usr/lib -licucore env['ICU_LIB_NAME'] = os.path.basename(env['ICU_LIB_NAME']).replace('.dylib','').replace('lib','') # Adding the required prerequisite library directories to the include path for # compiling and the library path for linking, respectively. - for required in ('ICU', 'SQLITE', 'LTDL'): + for required in ('ICU', 'SQLITE'): inc_path = env['%s_INCLUDES' % required] lib_path = env['%s_LIBS' % required] env.AppendUnique(CPPPATH = os.path.realpath(inc_path)) @@ -1128,16 +1179,18 @@ if not preconfigured: # https://github.com/mapnik/mapnik/issues/913 if conf.parse_config('XML2_CONFIG',checks='--cflags'): env['HAS_LIBXML2'] = True + else: + env['MISSING_DEPS'].append('libxml2') - LIBSHEADERS = [ + REQUIRED_LIBSHEADERS = [ ['z', 'zlib.h', True,'C'], - ['ltdl', 'ltdl.h', True,'C'], [env['ICU_LIB_NAME'],'unicode/unistr.h',True,'C++'], ] + OPTIONAL_LIBSHEADERS = [] + if env['JPEG']: - env.Append(CXXFLAGS = '-DHAVE_JPEG') - LIBSHEADERS.append(['jpeg', ['stdio.h', 'jpeglib.h'], True,'C']) + 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)) @@ -1146,8 +1199,7 @@ if not preconfigured: env['SKIPPED_DEPS'].extend(['jpeg']) if env['PROJ']: - env.Append(CXXFLAGS = '-DMAPNIK_USE_PROJ4') - LIBSHEADERS.append(['proj', 'proj_api.h', True,'C']) + 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)) @@ -1156,8 +1208,7 @@ if not preconfigured: env['SKIPPED_DEPS'].extend(['proj']) if env['PNG']: - env.Append(CXXFLAGS = '-DHAVE_PNG') - LIBSHEADERS.append(['png', 'png.h', True,'C']) + 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)) @@ -1165,9 +1216,17 @@ if not preconfigured: else: env['SKIPPED_DEPS'].extend(['png']) + if env['WEBP']: + 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)) + else: + env['SKIPPED_DEPS'].extend(['webp']) + if env['TIFF']: - env.Append(CXXFLAGS = '-DHAVE_TIFF') - LIBSHEADERS.append(['tiff', 'tiff.h', True,'C']) + 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)) @@ -1177,24 +1236,26 @@ if not preconfigured: # if requested, sort LIBPATH and CPPPATH before running CheckLibWithHeader tests if env['PRIORITIZE_LINKING']: - conf.prioritize_paths(silent=False) + conf.prioritize_paths(silent=True) - for libname, headers, required, lang in LIBSHEADERS: - if not conf.CheckLibWithHeader(libname, headers, lang): - if required: - color_print(1, 'Could not find required header or shared library for %s' % libname) - env['MISSING_DEPS'].append(libname) - else: - color_print(4, 'Could not find optional header or shared library for %s' % libname) - env['SKIPPED_DEPS'].append(libname) + if not env['HOST']: + for libname, headers, required, lang in REQUIRED_LIBSHEADERS: + if not conf.CheckLibWithHeader(libname, headers, lang): + if required: + color_print(1, 'Could not find required header or shared library for %s' % libname) + env['MISSING_DEPS'].append(libname) + else: + color_print(4, 'Could not find optional header or shared library for %s' % libname) + env['SKIPPED_DEPS'].append(libname) - 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']) + 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']) if env['BIGINT']: - env.Append(CXXFLAGS = '-DBIGINT') + env.Append(CPPDEFINES = '-DBIGINT') if env['THREADING'] == 'multi': thread_flag = thread_suffix @@ -1203,137 +1264,172 @@ if not preconfigured: conf.FindBoost(BOOST_SEARCH_PREFIXES,thread_flag) - env['BOOST_LIB_VERSION_FROM_HEADER'] = conf.GetBoostLibVersion() + has_boost_devel = True + if not env['HOST']: + if not conf.CheckHeader(header='boost/version.hpp',language='C++'): + env['MISSING_DEPS'].append('boost development headers') + has_boost_devel = False - # The other required boost headers. - BOOST_LIBSHEADERS = [ - ['system', 'boost/system/system_error.hpp', True], - ['filesystem', 'boost/filesystem/operations.hpp', True], - ['regex', 'boost/regex.hpp', True], - ['program_options', 'boost/program_options.hpp', False] - ] + if has_boost_devel: + if not env['HOST']: + env['BOOST_LIB_VERSION_FROM_HEADER'] = conf.GetBoostLibVersion() - if env['THREADING'] == 'multi': - BOOST_LIBSHEADERS.append(['thread', 'boost/thread/mutex.hpp', True]) - # on solaris the configure checks for boost_thread - # require the -pthreads flag to be able to check for - # threading support, so we add as a global library instead - # of attaching to cxxflags after configure - if env['PLATFORM'] == 'SunOS': - env.Append(CXXFLAGS = '-pthreads') + # The other required boost headers. + BOOST_LIBSHEADERS = [ + ['system', 'boost/system/system_error.hpp', True], + ['filesystem', 'boost/filesystem/operations.hpp', True], + ['regex', 'boost/regex.hpp', True], + ['program_options', 'boost/program_options.hpp', False] + ] - # if requested, sort LIBPATH and CPPPATH before running CheckLibWithHeader tests - if env['PRIORITIZE_LINKING']: - conf.prioritize_paths() + if env['THREADING'] == 'multi': + BOOST_LIBSHEADERS.append(['thread', 'boost/thread/mutex.hpp', True]) + # on solaris the configure checks for boost_thread + # require the -pthreads flag to be able to check for + # threading support, so we add as a global library instead + # of attaching to cxxflags after configure + if env['PLATFORM'] == 'SunOS': + env.Append(CXXFLAGS = '-pthreads') - # if the user is not setting custom boost configuration - # enforce boost version greater than or equal to BOOST_MIN_VERSION - if not conf.CheckBoost(BOOST_MIN_VERSION): - color_print(4,'Found boost lib version... %s' % env.get('BOOST_LIB_VERSION_FROM_HEADER') ) - color_print(1,'Boost version %s or greater is required' % BOOST_MIN_VERSION) - if not env['BOOST_VERSION']: - env['MISSING_DEPS'].append('boost version >=%s' % BOOST_MIN_VERSION) - else: - color_print(4,'Found boost lib version... %s' % env.get('BOOST_LIB_VERSION_FROM_HEADER') ) + # if requested, sort LIBPATH and CPPPATH before running CheckLibWithHeader tests + if env['PRIORITIZE_LINKING']: + conf.prioritize_paths(silent=True) - for count, libinfo in enumerate(BOOST_LIBSHEADERS): - if not conf.CheckLibWithHeader('boost_%s%s' % (libinfo[0],env['BOOST_APPEND']), libinfo[1], 'C++'): - if libinfo[2]: - color_print(1,'Could not find required header or shared library for boost %s' % libinfo[0]) - env['MISSING_DEPS'].append('boost ' + libinfo[0]) + if not env['HOST']: + # if the user is not setting custom boost configuration + # enforce boost version greater than or equal to BOOST_MIN_VERSION + if not conf.CheckBoost(BOOST_MIN_VERSION): + color_print(4,'Found boost lib version... %s' % env.get('BOOST_LIB_VERSION_FROM_HEADER') ) + color_print(1,'Boost version %s or greater is required' % BOOST_MIN_VERSION) + if not env['BOOST_VERSION']: + env['MISSING_DEPS'].append('boost version >= %s' % BOOST_MIN_VERSION) else: - color_print(4,'Could not find optional header or shared library for boost %s' % libinfo[0]) - env['SKIPPED_DEPS'].append('boost ' + libinfo[0]) + color_print(4,'Found boost lib version... %s' % env.get('BOOST_LIB_VERSION_FROM_HEADER') ) - if env['ICU_LIB_NAME'] not in env['MISSING_DEPS']: + if not env['HOST']: + for count, libinfo in enumerate(BOOST_LIBSHEADERS): + if not conf.CheckLibWithHeader('boost_%s%s' % (libinfo[0],env['BOOST_APPEND']), libinfo[1], 'C++'): + if libinfo[2]: + color_print(1,'Could not find required header or shared library for boost %s' % libinfo[0]) + env['MISSING_DEPS'].append('boost ' + libinfo[0]) + else: + color_print(4,'Could not find optional header or shared library for boost %s' % libinfo[0]) + env['SKIPPED_DEPS'].append('boost ' + libinfo[0]) + + 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 + # important to try this check with the library linked + env.AppendUnique(LIBS='icui18n') if conf.boost_regex_has_icu(): # TODO - should avoid having this be globally defined... - env.Append(CXXFLAGS = '-DBOOST_REGEX_HAS_ICU') + env.Append(CPPDEFINES = '-DBOOST_REGEX_HAS_ICU') else: env['SKIPPED_DEPS'].append('boost_regex_icu') + if not env['HOST']: + for libname, headers, required, lang, define in OPTIONAL_LIBSHEADERS: + if not conf.CheckLibWithHeader(libname, headers, lang): + if required: + color_print(1, 'Could not find required header or shared library for %s' % libname) + env['MISSING_DEPS'].append(libname) + else: + color_print(4, 'Could not find optional header or shared library for %s' % libname) + env['SKIPPED_DEPS'].append(libname) + else: + env.Append(CPPDEFINES = define) + else: + env.Append(CPPDEFINES = define) + env['REQUESTED_PLUGINS'] = [ driver.strip() for driver in Split(env['INPUT_PLUGINS'])] + SQLITE_HAS_RTREE = None + if env['HOST']: + SQLITE_HAS_RTREE = True + + CHECK_PKG_CONFIG = conf.CheckPKGConfig('0.15.0') + if len(env['REQUESTED_PLUGINS']): - color_print(4,'Checking for requested plugins dependencies...') - for plugin in env['REQUESTED_PLUGINS']: - details = env['PLUGINS'][plugin] - if plugin == 'gdal': - if conf.parse_config('GDAL_CONFIG',checks='--libs'): - conf.parse_config('GDAL_CONFIG',checks='--cflags') - libname = conf.get_pkg_lib('GDAL_CONFIG','gdal') - if libname: - details['lib'] = libname - elif plugin == 'postgis': - conf.parse_pg_config('PG_CONFIG') - elif plugin == 'ogr': - if conf.ogr_enabled(): - if not 'gdal' in env['REQUESTED_PLUGINS']: - conf.parse_config('GDAL_CONFIG',checks='--libs') + if env['HOST']: + for plugin in env['REQUESTED_PLUGINS']: + details = env['PLUGINS'][plugin] + if details['lib']: + env.AppendUnique(LIBS=details['lib']) + else: + color_print(4,'Checking for requested plugins dependencies...') + for plugin in env['REQUESTED_PLUGINS']: + details = env['PLUGINS'][plugin] + if plugin == 'gdal': + if conf.parse_config('GDAL_CONFIG',checks='--libs'): conf.parse_config('GDAL_CONFIG',checks='--cflags') - libname = conf.get_pkg_lib('GDAL_CONFIG','ogr') - if libname: - details['lib'] = libname - elif plugin == 'geos': - if conf.parse_config('GEOS_CONFIG',checks='--ldflags --cflags'): - lgeos_c = env['PLUGINS']['geos']['lib'] - env.Append(LIBS = lgeos_c) + libname = conf.get_pkg_lib('GDAL_CONFIG','gdal') + if libname: + details['lib'] = libname + elif plugin == 'postgis': + conf.parse_pg_config('PG_CONFIG') + elif plugin == 'ogr': + if conf.ogr_enabled(): + if not 'gdal' in env['REQUESTED_PLUGINS']: + conf.parse_config('GDAL_CONFIG',checks='--libs') + conf.parse_config('GDAL_CONFIG',checks='--cflags') + libname = conf.get_pkg_lib('GDAL_CONFIG','ogr') + if libname: + details['lib'] = libname + elif details['path'] and details['lib'] and details['inc']: + backup = env.Clone().Dictionary() + # Note, the 'delete_existing' keyword makes sure that these paths are prepended + # 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) + if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']): + env.Replace(**backup) + env['SKIPPED_DEPS'].append(details['lib']) + if plugin == 'sqlite': + SQLITE_HAS_RTREE = conf.sqlite_has_rtree() + 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 CHECK_PKG_CONFIG and conf.CheckPKG('sqlite3'): + sqlite_env = env.Clone() + try: + sqlite_env.ParseConfig('pkg-config --static --libs sqlite3') + for lib in sqlite_env['LIBS']: + if not lib in env['LIBS']: + env["SQLITE_LINKFLAGS"].append(lib) + env.Append(LIBS=lib) + except OSError,e: + pass + if SQLITE_HAS_RTREE is None: + SQLITE_HAS_RTREE = conf.sqlite_has_rtree() + if not SQLITE_HAS_RTREE: + env.Replace(**sqlite_backup) + if details['lib'] in env['LIBS']: + env['LIBS'].remove(details['lib']) + env['SKIPPED_DEPS'].append('sqlite_rtree') + else: + env.Replace(**sqlite_backup) + elif details['lib'] and details['inc']: + if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']): + env['SKIPPED_DEPS'].append(details['lib']) - elif details['path'] and details['lib'] and details['inc']: - backup = env.Clone().Dictionary() - # Note, the 'delete_existing' keyword makes sure that these paths are prepended - # 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) - if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']): - env.Replace(**backup) - env['SKIPPED_DEPS'].append(details['lib']) - if plugin == 'sqlite': - sqlite_backup = env.Clone().Dictionary() + # re-append the local paths for mapnik sources to the beginning of the list + # to make sure they come before any plugins that were 'prepended' + env.PrependUnique(CPPPATH = '#include', delete_existing=True) + env.PrependUnique(CPPPATH = '#', delete_existing=True) + env.PrependUnique(LIBPATH = '#src', delete_existing=True) - # if statically linking, on linux we likely - # need to link sqlite to pthreads and dl - if env['RUNTIME_LINK'] == 'static': - if conf.CheckPKGConfig('0.15.0') and conf.CheckPKG('sqlite3'): - sqlite_env = env.Clone() - try: - sqlite_env.ParseConfig('pkg-config --static --libs sqlite3') - for lib in sqlite_env['LIBS']: - if not lib in env['LIBS']: - env["SQLITE_LINKFLAGS"].append(lib) - env.Append(LIBS=lib) - except OSError,e: - pass - - if not conf.sqlite_has_rtree(): - env.Replace(**sqlite_backup) - if details['lib'] in env['LIBS']: - env['LIBS'].remove(details['lib']) - env['SKIPPED_DEPS'].append('sqlite_rtree') - else: - env.Replace(**sqlite_backup) - - elif details['lib'] and details['inc']: - if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']): - env['SKIPPED_DEPS'].append(details['lib']) - - # re-append the local paths for mapnik sources to the beginning of the list - # to make sure they come before any plugins that were 'prepended' - env.PrependUnique(CPPPATH = '#include', delete_existing=True) - env.PrependUnique(CPPPATH = '#', delete_existing=True) - env.PrependUnique(LIBPATH = '#src', delete_existing=True) - - 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'])) - if not conf.sqlite_has_rtree(): - env['SKIPPED_DEPS'].append('pgsql2sqlite_rtree') - env['PGSQL2SQLITE'] = False + if not env['HOST']: + 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'])) + if not SQLITE_HAS_RTREE: + env['SKIPPED_DEPS'].append('pgsql2sqlite_rtree') + env['PGSQL2SQLITE'] = False # we rely on an internal, patched copy of agg with critical fixes # prepend to make sure we link locally @@ -1362,15 +1458,15 @@ if not preconfigured: #os.path.join(c_inc,'include/libpng'), ] ) - env["CAIRO_LINKFLAGS"] = ['cairo'] + env["CAIRO_ALL_LIBS"] = ['cairo'] if env['RUNTIME_LINK'] == 'static': - env["CAIRO_LINKFLAGS"].extend( - ['pixman-1','expat','fontconfig','iconv'] + env["CAIRO_ALL_LIBS"].extend( + ['pixman-1','expat','fontconfig'] ) # todo - run actual checkLib? env['HAS_CAIRO'] = True else: - if not conf.CheckPKGConfig('0.15.0'): + if not CHECK_PKG_CONFIG: env['HAS_CAIRO'] = False env['SKIPPED_DEPS'].append('pkg-config') env['SKIPPED_DEPS'].append('cairo') @@ -1387,7 +1483,7 @@ if not preconfigured: cairo_env.ParseConfig(cmd) for lib in cairo_env['LIBS']: if not lib in env['LIBS']: - env["CAIRO_LINKFLAGS"].append(lib) + env["CAIRO_ALL_LIBS"].append(lib) for lpath in cairo_env['LIBPATH']: if not lpath in env['LIBPATH']: env["CAIRO_LIBPATHS"].append(lpath) @@ -1404,6 +1500,11 @@ if not preconfigured: else: color_print(4,'Not building with cairo support, pass CAIRO=True to enable') + if not env['HOST'] and env['HAS_CAIRO']: + if not conf.CheckCairoHasFreetype(): + 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']) @@ -1466,17 +1567,18 @@ if not preconfigured: else: env['PYTHON_IS_64BIT'] = False - if 'python' in env['BINDINGS']: + 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 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 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 conf.CheckPKGConfig('0.15.0') and conf.CheckPKG('pycairo'): + if CHECK_PKG_CONFIG and conf.CheckPKG('pycairo'): env['HAS_PYCAIRO'] = True else: env['SKIPPED_DEPS'].extend(['pycairo']) @@ -1498,7 +1600,7 @@ if not preconfigured: color_print(4," $ sudo python scons/scons.py install") color_print(4,"\nTo view available path variables:\n $ python scons/scons.py --help or -h") color_print(4,'\nTo view overall SCons help options:\n $ python scons/scons.py --help-options or -H\n') - color_print(4,'More info: https://github.com/mapnik/mapnik/wiki//MapnikInstallation') + color_print(4,'More info: https://github.com/mapnik/mapnik/wiki/Mapnik-Installation') if not HELP_REQUESTED: Exit(1) else: @@ -1518,43 +1620,41 @@ if not preconfigured: color_print(4,"Did not use user config file, no custom path variables will be saved...") if env['SKIPPED_DEPS']: - color_print(3,'\nNote: will build without these OPTIONAL dependencies:\n - %s' % '\n - '.join([pretty_dep(dep) for dep in env['SKIPPED_DEPS']])) + color_print(4,'\nNote: will build without these OPTIONAL dependencies:\n - %s' % '\n - '.join([pretty_dep(dep) for dep in env['SKIPPED_DEPS']])) print # fetch the mapnik version header in order to set the # ABI version used to build libmapnik.so on linux in src/build.py - abi = conf.GetMapnikLibVersion() - abi_fallback = "2.2.0-pre" + abi = None + abi_fallback = "3.0.0-pre" + if not env['HOST']: + abi = conf.GetMapnikLibVersion() if not abi: - color_print(1,'Problem encountered parsing mapnik version, falling back to %s' % abi_fallback) + if not env['HOST']: + color_print(1,'Problem encountered parsing mapnik version, falling back to %s' % abi_fallback) abi = abi_fallback - env['ABI_VERSION'] = abi.replace('-pre','').split('.') + abi_no_pre = abi.replace('-pre','').split('.') + env['ABI_VERSION'] = abi_no_pre env['MAPNIK_VERSION_STRING'] = abi + env['MAPNIK_VERSION'] = str(int(abi_no_pre[0])*100000+int(abi_no_pre[1])*100+int(abi_no_pre[2])) - # Common C++ flags. + # Common DEFINES. + env.Append(CPPDEFINES = '-D%s' % env['PLATFORM'].upper()) if env['THREADING'] == 'multi': - common_cxx_flags = '-D%s -DMAPNIK_THREADSAFE ' % env['PLATFORM'].upper() - else : - common_cxx_flags = '-D%s ' % env['PLATFORM'].upper() + env.Append(CPPDEFINES = '-DMAPNIK_THREADSAFE') # Mac OSX (Darwin) special settings if env['PLATFORM'] == 'Darwin': pthread = '' - # Getting the macintosh version number, sticking as a compiler macro - # for Leopard -- needed because different workarounds are needed than - # for Tiger. - # this was used for fribidi - not longer needed - # but will retain logic for future use - #if platform.mac_ver()[0].startswith('10.5'): - # common_cxx_flags += '-DOSX_LEOPARD ' else: pthread = '-pthread' # Common debugging flags. # http://lists.fedoraproject.org/pipermail/devel/2010-November/144952.html - debug_flags = '-g -fno-omit-frame-pointer -DDEBUG -DMAPNIK_DEBUG' - ndebug_flags = '-DNDEBUG' + debug_flags = ['-g', '-fno-omit-frame-pointer'] + debug_defines = ['-DDEBUG', '-DMAPNIK_DEBUG'] + ndebug_defines = ['-DNDEBUG'] # Enable logging in debug mode (always) and release mode (when specified) if env['DEFAULT_LOG_SEVERITY']: @@ -1569,42 +1669,48 @@ if not preconfigured: color_print(1,"No logger severity specified, available options are %s." % severities_list) Exit(1) - log_enabled = ' -DMAPNIK_LOG -DMAPNIK_DEFAULT_LOG_SEVERITY=%d' % log_severity + log_enabled = ['-DMAPNIK_LOG', '-DMAPNIK_DEFAULT_LOG_SEVERITY=%d' % log_severity] if env['DEBUG']: - debug_flags += log_enabled + debug_defines += log_enabled else: if env['ENABLE_LOG']: - ndebug_flags += log_enabled + ndebug_defines += log_enabled # Enable statistics reporting if env['ENABLE_STATS']: - debug_flags += ' -DMAPNIK_STATS' - ndebug_flags += ' -DMAPNIK_STATS' + debug_defines.append('-DMAPNIK_STATS') + ndebug_defines.append('-DMAPNIK_STATS') # Add rdynamic to allow using statics between application and plugins # http://stackoverflow.com/questions/8623657/multiple-instances-of-singleton-across-shared-libraries-on-linux if env['PLATFORM'] != 'Darwin' and env['CXX'] == 'g++': env.MergeFlags('-rdynamic') - # Customizing the C++ compiler flags depending on: - # (1) the C++ compiler used; and - # (2) whether debug binaries are requested. - if env['SUNCC']: - if env['DEBUG']: - env.Append(CXXFLAGS = common_cxx_flags + debug_flags) - else: - env.Append(CXXFLAGS = common_cxx_flags + '-O %s' % ndebug_flags) + if env['DEBUG']: + env.Append(CXXFLAGS = debug_flags) + env.Append(CPPDEFINES = debug_defines) else: - # Common flags for GCC. - gcc_cxx_flags = '-ansi -Wall %s %s -ftemplate-depth-300 %s' % (env['WARNING_CXXFLAGS'], pthread, common_cxx_flags) + env.Append(CPPDEFINES = ndebug_defines) + + if not env['SUNCC']: + + # Common flags for CXX compiler. + common_cxx_flags = '-ansi -Wall %s %s -ftemplate-depth-300 ' % (env['WARNING_CXXFLAGS'], pthread) + + # https://github.com/mapnik/mapnik/issues/1835 + if sys.platform == 'darwin' and env['CXX'] == 'g++': + common_cxx_flags += '-fpermissive ' + if env['DEBUG']: - env.Append(CXXFLAGS = gcc_cxx_flags + '-O0 -fno-inline %s' % debug_flags) + env.Append(CXXFLAGS = common_cxx_flags + '-O0 -fno-inline') else: - env.Append(CXXFLAGS = gcc_cxx_flags + '-O%s -fno-strict-aliasing -finline-functions -Wno-inline -Wno-parentheses -Wno-char-subscripts %s' % (env['OPTIMIZATION'],ndebug_flags)) + # TODO - add back -fvisibility-inlines-hidden + # https://github.com/mapnik/mapnik/issues/1863 + env.Append(CXXFLAGS = common_cxx_flags + '-O%s -fno-strict-aliasing -finline-functions -Wno-inline -Wno-parentheses -Wno-char-subscripts' % (env['OPTIMIZATION'])) if env['DEBUG_UNDEFINED']: - env.Append(CXXFLAGS = '-fcatch-undefined-behavior -ftrapv -fwrapv') + 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('.') @@ -1631,7 +1737,7 @@ if not preconfigured: # if requested, sort LIBPATH and CPPPATH one last time before saving... if env['PRIORITIZE_LINKING']: - conf.prioritize_paths() + conf.prioritize_paths(silent=True) # finish config stage and pickle results env = conf.Finish() @@ -1689,15 +1795,11 @@ if not HELP_REQUESTED: p = env['PATH_REMOVE'] if p in env['ENV']['PATH']: env['ENV']['PATH'].replace(p,'') - def rm_path(set): - for i in env[set]: - if p in i: - env[set].remove(i) - rm_path('LIBPATH') - rm_path('CPPPATH') - rm_path('CXXFLAGS') - rm_path('CAIRO_LIBPATHS') - rm_path('CAIRO_CPPPATHS') + rm_path(p,'LIBPATH',env) + rm_path(p,'CPPPATH',env) + rm_path(p,'CXXFLAGS',env) + rm_path(p,'CAIRO_LIBPATHS',env) + rm_path(p,'CAIRO_CPPPATHS',env) if env['PATH_REPLACE']: searches,replace = env['PATH_REPLACE'].split(':') @@ -1720,21 +1822,9 @@ if not HELP_REQUESTED: Export('env') plugin_base = env.Clone() - # for this to work you need: - # if __GNUC__ >= 4 - # define MAPNIK_EXP __attribute__ ((visibility ("default"))) - #plugin_base.Append(CXXFLAGS='-fvisibility=hidden') - #plugin_base.Append(CXXFLAGS='-fvisibility-inlines-hidden') Export('plugin_base') - # clear the '_CPPDEFFLAGS' variable - # for unknown reasons this variable puts -DNone - # in the g++ args prompting unnecessary recompiles - env['_CPPDEFFLAGS'] = None - plugin_base['_CPPDEFFLAGS'] = None - - if env['FAST']: # caching is 'auto' by default in SCons # But let's also cache implicit deps... @@ -1761,58 +1851,69 @@ if not HELP_REQUESTED: # Build the requested and able-to-be-compiled input plug-ins GDAL_BUILT = False OGR_BUILT = False - for plugin in env['REQUESTED_PLUGINS']: - details = env['PLUGINS'][plugin] - if details['lib'] in env['LIBS']: - SConscript('plugins/input/%s/build.py' % plugin) - if plugin == 'ogr': OGR_BUILT = True - if plugin == 'gdal': GDAL_BUILT = True - if plugin == 'ogr' or plugin == 'gdal': - if GDAL_BUILT and OGR_BUILT: - env['LIBS'].remove(details['lib']) - else: - env['LIBS'].remove(details['lib']) - elif not details['lib']: - # build internal shape and raster plugins - SConscript('plugins/input/%s/build.py' % plugin) - else: - color_print(1,"Notice: dependencies not met for plugin '%s', not building..." % plugin) - # also clear out locally built target + for plugin in env['PLUGINS']: + if env['PLUGIN_LINKING'] == 'static' or plugin not in env['REQUESTED_PLUGINS']: if os.path.exists('plugins/input/%s.input' % plugin): os.unlink('plugins/input/%s.input' % plugin) + elif plugin in env['REQUESTED_PLUGINS']: + details = env['PLUGINS'][plugin] + if details['lib'] in env['LIBS']: + if env['PLUGIN_LINKING'] == 'shared': + SConscript('plugins/input/%s/build.py' % plugin) + if plugin == 'ogr': OGR_BUILT = True + if plugin == 'gdal': GDAL_BUILT = True + if plugin == 'ogr' or plugin == 'gdal': + if GDAL_BUILT and OGR_BUILT: + env['LIBS'].remove(details['lib']) + else: + env['LIBS'].remove(details['lib']) + elif not details['lib']: + if env['PLUGIN_LINKING'] == 'shared': + # build internal datasource input plugins + SConscript('plugins/input/%s/build.py' % plugin) + else: + color_print(1,"Notice: dependencies not met for plugin '%s', not building..." % plugin) + if os.path.exists('plugins/input/%s.input' % plugin): + os.unlink('plugins/input/%s.input' % plugin) create_uninstall_target(env, env['MAPNIK_LIB_DIR_DEST'], False) create_uninstall_target(env, env['MAPNIK_INPUT_PLUGINS_DEST'] , False) - # before installing plugins, wipe out any previously - # installed plugins that we are no longer building if 'install' in COMMAND_LINE_TARGETS: + # if statically linking plugins still make sure + # to create the dynamic plugins directory + if env['PLUGIN_LINKING'] == 'static': + if not os.path.exists(env['MAPNIK_INPUT_PLUGINS_DEST']): + os.makedirs(env['MAPNIK_INPUT_PLUGINS_DEST']) + # before installing plugins, wipe out any previously + # installed plugins that we are no longer building for plugin in PLUGINS.keys(): - if plugin not in env['REQUESTED_PLUGINS']: - plugin_path = os.path.join(env['MAPNIK_INPUT_PLUGINS_DEST'],'%s.input' % plugin) - if os.path.exists(plugin_path): - color_print(3,"Notice: removing out of date plugin: '%s'" % plugin_path) + plugin_path = os.path.join(env['MAPNIK_INPUT_PLUGINS_DEST'],'%s.input' % plugin) + if os.path.exists(plugin_path): + if plugin not in env['REQUESTED_PLUGINS'] or env['PLUGIN_LINKING'] == 'static': + color_print(4,"Notice: removing out of date plugin: '%s'" % plugin_path) os.unlink(plugin_path) # Build the c++ rundemo app if requested - if env['DEMO']: - SConscript('demo/c++/build.py') + if not env['HOST']: + if env['DEMO']: + SConscript('demo/c++/build.py') # Build shapeindex and remove its dependency from the LIBS - if 'boost_program_options%s' % env['BOOST_APPEND'] in env['LIBS']: - SConscript('utils/shapeindex/build.py') - - # Build the pgsql2psqlite app if requested - if env['PGSQL2SQLITE']: - SConscript('utils/pgsql2sqlite/build.py') - - SConscript('utils/svg2png/build.py') - - # devtools not ready for public - #SConscript('utils/ogrindex/build.py') - env['LIBS'].remove('boost_program_options%s' % env['BOOST_APPEND']) - else : - color_print(1,"WARNING: Cannot find boost_program_options. 'shapeindex' and other command line programs will not be available") + if not env['HOST']: + if 'boost_program_options%s' % env['BOOST_APPEND'] in env['LIBS']: + if env['SHAPEINDEX']: + SConscript('utils/shapeindex/build.py') + # Build the pgsql2psqlite app if requested + if env['PGSQL2SQLITE']: + SConscript('utils/pgsql2sqlite/build.py') + if env['SVG2PNG']: + SConscript('utils/svg2png/build.py') + # devtools not ready for public + #SConscript('utils/ogrindex/build.py') + env['LIBS'].remove('boost_program_options%s' % env['BOOST_APPEND']) + 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']: @@ -1828,13 +1929,13 @@ if not HELP_REQUESTED: SConscript('fonts/build.py') # build C++ tests - if env['CPP_TESTS']: - SConscript('tests/cpp_tests/build.py') + SConscript('tests/cpp_tests/build.py') - if env['SVG_RENDERER']: - SConscript('tests/cpp_tests/svg_renderer_tests/build.py') + if env['CPP_TESTS'] and env['SVG_RENDERER']: + SConscript('tests/cpp_tests/svg_renderer_tests/build.py') - SConscript('benchmark/build.py') + if env['BENCHMARK']: + SConscript('benchmark/build.py') # install pkg-config script and mapnik-config script SConscript('utils/mapnik-config/build.py') @@ -1845,11 +1946,14 @@ if not HELP_REQUESTED: # if requested, build the sample input plugins if env['SAMPLE_INPUT_PLUGINS']: SConscript('plugins/input/templates/helloworld/build.py') - elif '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(3,"Notice: removing out of date plugin: '%s'" % plugin_path) - os.unlink(plugin_path) + 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') # update linux project files if env['PLATFORM'] == 'Linux': diff --git a/benchmark/build.py b/benchmark/build.py index 4dc448854..5a7db1f4e 100644 --- a/benchmark/build.py +++ b/benchmark/build.py @@ -10,12 +10,16 @@ test_env['LIBS'] = copy(env['LIBMAPNIK_LIBS']) test_env.AppendUnique(LIBS='mapnik') #test_env.AppendUnique(LIBS='sqlite3') test_env.AppendUnique(CXXFLAGS='-g') +linkflags = copy(env['CUSTOM_LDFLAGS']) +linkflags +if env['PLATFORM'] == 'Darwin': + linkflags += ' -F/ -framework CoreFoundation' for cpp_test in glob.glob('run*.cpp'): name = cpp_test.replace('.cpp','') source_files = [cpp_test] test_env_local = test_env.Clone() - test_program = test_env_local.Program(name, source=source_files, LINKFLAGS=env['CUSTOM_LDFLAGS']) + test_program = test_env_local.Program(name, source=source_files, LINKFLAGS=linkflags) Depends(test_program, env.subst('../src/%s' % env['MAPNIK_LIB_NAME'])) # build locally if installing if 'install' in COMMAND_LINE_TARGETS: diff --git a/benchmark/data/polygon.wkt b/benchmark/data/polygon.wkt new file mode 100644 index 000000000..2fe5b480a --- /dev/null +++ b/benchmark/data/polygon.wkt @@ -0,0 +1 @@ +MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5))) \ No newline at end of file diff --git a/benchmark/run.cpp b/benchmark/run.cpp index daead8897..6173f6758 100644 --- a/benchmark/run.cpp +++ b/benchmark/run.cpp @@ -12,6 +12,8 @@ #include #include #include +#include + // boost #include @@ -35,44 +37,56 @@ typedef process_cpu_clock clock_type; typedef clock_type::duration dur; template -void benchmark(T test, std::string const& name) +void benchmark(T & test_runner, std::string const& name) { try { bool should_run_test = true; - if (!test_set.empty()) { + if (!test_set.empty()) + { should_run_test = test_set.find(test_num) != test_set.end(); } - if (should_run_test || dry_run) { - if (!test.validate()) { + if (should_run_test || dry_run) + { + if (!test_runner.validate()) + { std::clog << "test did not validate: " << name << "\n"; //throw std::runtime_error(std::string("test did not validate: ") + name); } - if (dry_run) { - std::clog << test_num << ") " << (test.threads_ ? "threaded -> ": "") + if (dry_run) + { + std::clog << test_num << ") " << (test_runner.threads_ ? "threaded -> ": "") << name << "\n"; - } else { + } + else + { process_cpu_clock::time_point start; dur elapsed; - if (test.threads_ > 0) { + if (test_runner.threads_ > 0) + { boost::thread_group tg; - for (unsigned i=0;i ": "") + std::clog << test_num << ") " << (test_runner.threads_ ? "threaded -> ": "") << name << ": " << boost::chrono::duration_cast(elapsed) << "\n"; } } - } catch (std::exception const& ex) { + } + catch (std::exception const& ex) + { std::clog << "test runner did not complete: " << ex.what() << "\n"; } test_num++; @@ -252,7 +266,7 @@ struct test5 s.resize(s.capacity()); while (true) { - size_t n2 = static_cast(snprintf(&s[0], s.size()+1, "%g", val_)); + size_t n2 = static_cast(snprintf(&s[0], s.size()+1, "%g", val)); if (n2 <= s.size()) { s.resize(n2); @@ -380,13 +394,15 @@ struct test8 bool validate() { - mapnik::expression_grammar expr_grammar(transcoder("utf-8")); - mapnik::expression_ptr expr = mapnik::parse_expression(expr_,expr_grammar); - return mapnik::to_expression_string(*expr) == expr_; + transcoder tr("utf-8"); + mapnik::expression_grammar expr_grammar(tr); + mapnik::expression_ptr expr = mapnik::parse_expression(expr_,expr_grammar); + return mapnik::to_expression_string(*expr) == expr_; } void operator()() { - mapnik::expression_grammar expr_grammar(transcoder("utf-8")); + transcoder tr("utf-8"); + mapnik::expression_grammar expr_grammar(tr); for (unsigned i=0;i +#include "agg_conv_clipper.h" +#include "agg_path_storage.h" +#include + +struct test11 +{ + unsigned iter_; + unsigned threads_; + std::string wkt_in_; + mapnik::box2d extent_; + typedef agg::conv_clipper poly_clipper; + test11(unsigned iterations, + unsigned threads, + std::string wkt_in, + mapnik::box2d const& extent) + : iter_(iterations), + threads_(threads), + wkt_in_(wkt_in), + extent_(extent) { + + } + + bool validate() + { + return true; + } + void operator()() + { + boost::ptr_vector paths; + if (!mapnik::from_wkt(wkt_in_, paths)) + { + 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(); + for (unsigned i=0;i + +struct test12 +{ + unsigned iter_; + unsigned threads_; + std::string wkt_in_; + + mapnik::box2d extent_; + typedef mapnik::polygon_clipper poly_clipper; + test12(unsigned iterations, + unsigned threads, + std::string wkt_in, + mapnik::box2d const& extent) + : iter_(iterations), + threads_(threads), + wkt_in_(wkt_in), + extent_(extent) + { + } + + bool validate() + { + return true; + } + void operator()() + { + boost::ptr_vector paths; + if (!mapnik::from_wkt(wkt_in_, paths)) + { + throw std::runtime_error("Failed to parse WKT"); + } + for (unsigned i=0;i +#include +struct test13 +{ + unsigned iter_; + unsigned threads_; + + test13(unsigned iterations, + unsigned threads) + : iter_(iterations), + threads_(threads) + {} + + bool validate() + { + return true; + } + + void operator()() + { + mapnik::freetype_engine engine; + unsigned long count = 0; + for (unsigned i=0;i 0) { @@ -720,6 +872,42 @@ int main( int argc, char** argv) benchmark(runner,"rule caching using heap allocation"); } + { + std::string filename_("benchmark/data/polygon.wkt"); + std::ifstream in(filename_.c_str(),std::ios_base::in | std::ios_base::binary); + if (!in.is_open()) + throw std::runtime_error("could not open: '" + filename_ + "'"); + std::string wkt_in( (std::istreambuf_iterator(in) ), + (std::istreambuf_iterator()) ); + mapnik::box2d clipping_box(0,0,40,40); + + test11 runner(100000,10,wkt_in,clipping_box); + benchmark(runner,"clipping polygon with agg_conv_clipper"); + } + + { + + std::string filename_("benchmark/data/polygon.wkt"); + std::ifstream in(filename_.c_str(),std::ios_base::in | std::ios_base::binary); + if (!in.is_open()) + throw std::runtime_error("could not open: '" + filename_ + "'"); + std::string wkt_in( (std::istreambuf_iterator(in) ), + (std::istreambuf_iterator()) ); + mapnik::box2d clipping_box(0,0,40,40); + + test12 runner(100000,10,wkt_in,clipping_box); + benchmark(runner,"clipping polygon with mapnik::polygon_clipper"); + } + + { + bool success = mapnik::freetype_engine::register_fonts("./fonts", true); + if (!success) { + std::clog << "warning, did not register any new fonts!\n"; + } + unsigned face_count = mapnik::freetype_engine::face_names().size(); + test13 runner(1000,10); + benchmark(runner, (boost::format("font_engihe: created %ld faces in ") % (face_count * 1000 * 10)).str()); + } std::cout << "...benchmark done\n"; return 0; } diff --git a/bindings/python/build.py b/bindings/python/build.py index a16bb4533..7526ea48d 100644 --- a/bindings/python/build.py +++ b/bindings/python/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -43,20 +43,23 @@ prefix = env['PREFIX'] target_path = os.path.normpath(env['PYTHON_INSTALL_LOCATION'] + os.path.sep + 'mapnik') target_path_deprecated = os.path.normpath(env['PYTHON_INSTALL_LOCATION'] + os.path.sep + 'mapnik2') -libraries = ['mapnik',env['BOOST_PYTHON_LIB']] +py_env = env.Clone() +py_env.Append(CPPPATH = env['PYTHON_INCLUDES']) + +py_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES']) + +py_env['LIBS'] = ['mapnik',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']) + +if link_all_libs: + py_env.AppendUnique(LIBS=env['LIBMAPNIK_LIBS']) + +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': - if not env['PYTHON_DYNAMIC_LOOKUP']: - if env['PNG']: - libraries.append('png') - if env['JPEG']: - libraries.append('jpeg') - libraries.append(env['ICU_LIB_NAME']) - libraries.append('boost_regex%s' % env['BOOST_APPEND']) - if env['THREADING'] == 'multi': - libraries.append('boost_thread%s' % env['BOOST_APPEND']) - ##### Python linking on OS X is tricky ### # Confounding problems are: # 1) likelyhood of multiple python installs of the same major.minor version @@ -96,7 +99,6 @@ if env['PLATFORM'] == 'Darwin': 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/? @@ -147,9 +149,6 @@ except: pass # install the shared object beside the module directory sources = glob.glob('*.cpp') -py_env = env.Clone() -py_env.Append(CPPPATH = env['PYTHON_INCLUDES']) - if 'install' in COMMAND_LINE_TARGETS: # install the core mapnik python files, including '__init__.py' init_files = glob.glob('mapnik/*.py') @@ -175,16 +174,16 @@ if 'install' in COMMAND_LINE_TARGETS: if 'uninstall' not in COMMAND_LINE_TARGETS: if env['HAS_CAIRO']: py_env.Append(CPPPATH = env['CAIRO_CPPPATHS']) - py_env.Append(CXXFLAGS = '-DHAVE_CAIRO') - if env['PLATFORM'] == 'Darwin': - py_env.Append(LIBS=env['CAIRO_LINKFLAGS']) + 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(CXXFLAGS = '-DHAVE_PYCAIRO') + py_env.Append(CPPDEFINES = '-DHAVE_PYCAIRO') -libraries.append('boost_thread%s' % env['BOOST_APPEND']) -_mapnik = py_env.LoadableModule('mapnik/_mapnik', sources, LIBS=libraries, LDMODULEPREFIX='', LDMODULESUFFIX='.so',LINKFLAGS=linkflags) +py_env.AppendUnique(LIBS = 'boost_thread%s' % env['BOOST_APPEND']) +_mapnik = py_env.LoadableModule('mapnik/_mapnik', sources, LDMODULEPREFIX='', LDMODULESUFFIX='.so',LINKFLAGS=linkflags) Depends(_mapnik, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME'])) diff --git a/bindings/python/mapnik/__init__.py b/bindings/python/mapnik/__init__.py index eca8c89b8..9fc06d96b 100644 --- a/bindings/python/mapnik/__init__.py +++ b/bindings/python/mapnik/__init__.py @@ -340,6 +340,53 @@ def Shapefile(**keywords): 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. @@ -558,44 +605,6 @@ def Osm(**keywords): keywords['type'] = 'osm' return CreateDatasource(keywords) -def Kismet(**keywords): - """Create a Kismet Datasource. - - Required keyword arguments: - host -- kismet hostname - port -- kismet port - - Optional keyword arguments: - encoding -- file encoding (default 'utf-8') - extent -- manually specified data extent (comma delimited string, default None) - - >>> from mapnik import Kismet, Layer - >>> datasource = Kismet(host='localhost',port=2501,extent='-179,-85,179,85') - >>> lyr = Layer('Kismet Server Layer') - >>> lyr.datasource = datasource - - """ - keywords['type'] = 'kismet' - return CreateDatasource(keywords) - -def Geos(**keywords): - """Create a GEOS Vector Datasource. - - Required keyword arguments: - wkt -- inline WKT text of the geometry - - Optional keyword arguments: - extent -- manually specified data extent (comma delimited string, default None) - - >>> from mapnik import Geos, Layer - >>> datasource = Geos(wkt='MULTIPOINT(100 100, 50 50, 0 0)') - >>> lyr = Layer('GEOS Layer from WKT string') - >>> lyr.datasource = datasource - - """ - keywords['type'] = 'geos' - return CreateDatasource(keywords) - def Python(**keywords): """Create a Python Datasource. diff --git a/bindings/python/mapnik_datasource.cpp b/bindings/python/mapnik_datasource.cpp index 6da2cb0fd..85e2ff721 100644 --- a/bindings/python/mapnik_datasource.cpp +++ b/bindings/python/mapnik_datasource.cpp @@ -48,14 +48,30 @@ namespace { //user-friendly wrapper that uses Python dictionary using namespace boost::python; -boost::shared_ptr create_datasource(const dict& d) +boost::shared_ptr create_datasource(dict const& d) { mapnik::parameters params; boost::python::list keys=d.keys(); - for (int i=0; i(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 ex0(obj); extract ex1(obj); extract ex2(obj); @@ -138,6 +154,9 @@ boost::python::list field_types(boost::shared_ptr const& ds) return fld_types; }} +mapnik::parameters const& (mapnik::datasource::*params_const)() const = &mapnik::datasource::params; + + void export_datasource() { using namespace boost::python; @@ -164,7 +183,7 @@ void export_datasource() .def("fields",&fields) .def("field_types",&field_types) .def("features_at_point",&datasource::features_at_point, (arg("coord"),arg("tolerance")=0)) - .def("params",&datasource::params,return_value_policy(), + .def("params",make_function(params_const,return_value_policy()), "The configuration parameters of the data source. " "These vary depending on the type of data source.") ; diff --git a/bindings/python/mapnik_debug_symbolizer.cpp b/bindings/python/mapnik_debug_symbolizer.cpp new file mode 100644 index 000000000..6b255967f --- /dev/null +++ b/bindings/python/mapnik_debug_symbolizer.cpp @@ -0,0 +1,42 @@ +/***************************************************************************** + * + * 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 +#include "mapnik_enumeration.hpp" +#include + +void export_debug_symbolizer() +{ + using namespace boost::python; + + mapnik::enumeration_("debug_symbolizer_mode") + .value("COLLISION",mapnik::DEBUG_SYM_MODE_COLLISION) + .value("VERTEX",mapnik::DEBUG_SYM_MODE_VERTEX) + ; + + class_("DebugSymbolizer", + init<>("Default debug Symbolizer")) + .add_property("mode", + &mapnik::debug_symbolizer::get_mode, + &mapnik::debug_symbolizer::set_mode) + ; +} diff --git a/bindings/python/mapnik_expression.cpp b/bindings/python/mapnik_expression.cpp index d3bd8b1dd..caf4d2525 100644 --- a/bindings/python/mapnik_expression.cpp +++ b/bindings/python/mapnik_expression.cpp @@ -34,8 +34,6 @@ #include #include - -using mapnik::Feature; using mapnik::expression_ptr; using mapnik::parse_expression; using mapnik::to_expression_string; @@ -53,15 +51,15 @@ 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 const& f) +mapnik::value expression_evaluate_(mapnik::expr_node const& expr, mapnik::feature_impl const& f) { // will be auto-converted to proper python type by `mapnik_value_to_python` - return boost::apply_visitor(mapnik::evaluate(f),expr); + return boost::apply_visitor(mapnik::evaluate(f),expr); } -bool expression_evaluate_to_bool_(mapnik::expr_node const& expr, mapnik::Feature const& f) +bool expression_evaluate_to_bool_(mapnik::expr_node const& expr, mapnik::feature_impl const& f) { - return boost::apply_visitor(mapnik::evaluate(f),expr).to_bool(); + return boost::apply_visitor(mapnik::evaluate(f),expr).to_bool(); } // path expression @@ -75,7 +73,7 @@ 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 const& f) +std::string path_evaluate_(mapnik::path_expression const& expr, mapnik::feature_impl const& f) { return mapnik::path_processor_type::evaluate(expr, f); } diff --git a/bindings/python/mapnik_feature.cpp b/bindings/python/mapnik_feature.cpp index 0c7e6745e..19b3b4aa2 100644 --- a/bindings/python/mapnik_feature.cpp +++ b/bindings/python/mapnik_feature.cpp @@ -30,7 +30,6 @@ #include #include - // mapnik #include #include @@ -39,30 +38,33 @@ #include #include +// stl +#include + namespace { -using mapnik::Feature; using mapnik::geometry_utils; using mapnik::from_wkt; using mapnik::context_type; using mapnik::context_ptr; using mapnik::feature_kv_iterator; -mapnik::geometry_type const& (mapnik::Feature::*get_geometry_by_const_ref)(unsigned) const = &mapnik::Feature::get_geometry; -boost::ptr_vector const& (mapnik::Feature::*get_paths_by_const_ref)() const = &mapnik::Feature::paths; +mapnik::geometry_type const& (mapnik::feature_impl::*get_geometry_by_const_ref)(unsigned) const = &mapnik::feature_impl::get_geometry; +boost::ptr_vector const& (mapnik::feature_impl::*get_paths_by_const_ref)() const = &mapnik::feature_impl::paths; -void feature_add_geometries_from_wkb(Feature &feature, std::string wkb) +void feature_add_geometries_from_wkb(mapnik::feature_impl &feature, std::string wkb) { - geometry_utils::from_wkb(feature.paths(), wkb.c_str(), wkb.size()); + 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(Feature &feature, std::string wkt) +void feature_add_geometries_from_wkt(mapnik::feature_impl &feature, std::string wkt) { bool result = mapnik::from_wkt(wkt, feature.paths()); if (!result) throw std::runtime_error("Failed to parse WKT"); } -std::string feature_to_geojson(Feature const& feature) +std::string feature_to_geojson(mapnik::feature_impl const& feature) { std::string json; mapnik::json::feature_generator g; @@ -73,22 +75,22 @@ std::string feature_to_geojson(Feature const& feature) return json; } -mapnik::value __getitem__(Feature const& feature, std::string const& name) +mapnik::value __getitem__(mapnik::feature_impl const& feature, std::string const& name) { return feature.get(name); } -mapnik::value __getitem2__(Feature const& feature, std::size_t index) +mapnik::value __getitem2__(mapnik::feature_impl const& feature, std::size_t index) { return feature.get(index); } -void __setitem__(Feature & feature, std::string const& name, mapnik::value const& val) +void __setitem__(mapnik::feature_impl & feature, std::string const& name, mapnik::value const& val) { feature.put_new(name,val); } -boost::python::dict attributes(Feature const& f) +boost::python::dict attributes(mapnik::feature_impl const& f) { boost::python::dict attributes; feature_kv_iterator itr = f.begin(); @@ -191,7 +193,6 @@ struct value_null_from_python void export_feature() { using namespace boost::python; - using mapnik::Feature; // Python to mapnik::value converters // NOTE: order matters here. For example value_null must be listed before @@ -211,25 +212,25 @@ void export_feature() .def("push", &context_type::push) ; - class_, + class_, boost::noncopyable>("Feature",init("Default ctor.")) - .def("id",&Feature::id) - .def("__str__",&Feature::to_string) + .def("id",&mapnik::feature_impl::id) + .def("__str__",&mapnik::feature_impl::to_string) .def("add_geometries_from_wkb", &feature_add_geometries_from_wkb) .def("add_geometries_from_wkt", &feature_add_geometries_from_wkt) - .def("add_geometry", &Feature::add_geometry) - .def("num_geometries",&Feature::num_geometries) + .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())) .def("geometries",make_function(get_paths_by_const_ref,return_value_policy())) - .def("envelope", &Feature::envelope) - .def("has_key", &Feature::has_key) + .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__", &Feature::size) - .def("context",&Feature::context) + .def("__len__", &mapnik::feature_impl::size) + .def("context",&mapnik::feature_impl::context) .def("to_geojson",&feature_to_geojson) ; } diff --git a/bindings/python/mapnik_featureset.cpp b/bindings/python/mapnik_featureset.cpp index 3148d116e..c1f7eecd4 100644 --- a/bindings/python/mapnik_featureset.cpp +++ b/bindings/python/mapnik_featureset.cpp @@ -65,10 +65,7 @@ inline mapnik::feature_ptr next(mapnik::featureset_ptr const& itr) void export_featureset() { using namespace boost::python; - using mapnik::Feature; - using mapnik::Featureset; - - class_, + class_, boost::noncopyable>("Featureset",no_init) .def("__iter__",pass_through) .def("next",next) diff --git a/bindings/python/mapnik_geometry.cpp b/bindings/python/mapnik_geometry.cpp index 61a2b5b1b..7d1a0d5f0 100644 --- a/bindings/python/mapnik_geometry.cpp +++ b/bindings/python/mapnik_geometry.cpp @@ -43,6 +43,9 @@ #include #endif +// stl +#include + namespace { using mapnik::from_wkt; diff --git a/bindings/python/mapnik_grid.cpp b/bindings/python/mapnik_grid.cpp index 1118d3b4b..09b21ee3d 100644 --- a/bindings/python/mapnik_grid.cpp +++ b/bindings/python/mapnik_grid.cpp @@ -20,6 +20,8 @@ * *****************************************************************************/ +#if defined(GRID_RENDERER) + // boost #include #include @@ -80,3 +82,5 @@ void export_grid() ; } + +#endif diff --git a/bindings/python/mapnik_grid_view.cpp b/bindings/python/mapnik_grid_view.cpp index aa29dda78..5e9d2745f 100644 --- a/bindings/python/mapnik_grid_view.cpp +++ b/bindings/python/mapnik_grid_view.cpp @@ -20,6 +20,8 @@ * *****************************************************************************/ +#if defined(GRID_RENDERER) + // boost #include #include @@ -49,3 +51,5 @@ void export_grid_view() ) ; } + +#endif diff --git a/bindings/python/mapnik_image.cpp b/bindings/python/mapnik_image.cpp index 9c7c1fd1e..5b3db5e9e 100644 --- a/bindings/python/mapnik_image.cpp +++ b/bindings/python/mapnik_image.cpp @@ -107,6 +107,28 @@ 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(im.width()) && y < static_cast(im.height())) @@ -142,6 +164,36 @@ boost::shared_ptr open_from_file(std::string const& filename) throw mapnik::image_reader_exception("Unsupported image format:" + filename); } +boost::shared_ptr fromstring(std::string const& str) +{ + std::auto_ptr reader(get_image_reader(str.c_str(),str.size())); + if (reader.get()) + { + boost::shared_ptr image_ptr = boost::make_shared(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" ); +} + +boost::shared_ptr frombuffer(PyObject * obj) +{ + void const* buffer=0; + Py_ssize_t buffer_len; + if (PyObject_AsReadBuffer(obj, &buffer, &buffer_len) == 0) + { + std::auto_ptr reader(get_image_reader(reinterpret_cast(buffer),buffer_len)); + if (reader.get()) + { + boost::shared_ptr image_ptr = boost::make_shared(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); @@ -206,6 +258,7 @@ void export_image() .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()), &image_32::set_background, "The background color of the image.") @@ -219,6 +272,7 @@ void export_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) @@ -234,6 +288,10 @@ void export_image() .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") diff --git a/bindings/python/mapnik_image_view.cpp b/bindings/python/mapnik_image_view.cpp index 18a0831b6..63bb61578 100644 --- a/bindings/python/mapnik_image_view.cpp +++ b/bindings/python/mapnik_image_view.cpp @@ -76,6 +76,27 @@ PyObject* view_tostring3(image_view const & view, std::string con (s.data(),s.size()); } +bool is_solid(image_view const& view) +{ + if (view.width() > 0 && view.height() > 0) + { + mapnik::image_view::pixel_type const* first_row = view.getRow(0); + mapnik::image_view::pixel_type const first_pixel = first_row[0]; + for (unsigned y = 0; y < view.height(); ++y) + { + mapnik::image_view::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 const& view, std::string const& filename) { @@ -104,6 +125,7 @@ void export_image_view() class_ >("ImageView","A view into an image.",no_init) .def("width",&image_view::width) .def("height",&image_view::height) + .def("is_solid",&is_solid) .def("tostring",&view_tostring1) .def("tostring",&view_tostring2) .def("tostring",&view_tostring3) diff --git a/bindings/python/mapnik_layer.cpp b/bindings/python/mapnik_layer.cpp index f3584a0ac..4656a5217 100644 --- a/bindings/python/mapnik_layer.cpp +++ b/bindings/python/mapnik_layer.cpp @@ -117,10 +117,14 @@ void set_buffer_size(mapnik::layer & l, boost::optional const& buffer_size) PyObject * get_buffer_size(mapnik::layer & l) { - boost::optional buffer_size = l.buffer_size(); + boost::optional 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 { diff --git a/bindings/python/mapnik_map.cpp b/bindings/python/mapnik_map.cpp index eecedf6d6..37c4a50d8 100644 --- a/bindings/python/mapnik_map.cpp +++ b/bindings/python/mapnik_map.cpp @@ -91,17 +91,6 @@ mapnik::featureset_ptr query_map_point(mapnik::Map const& m, int index, double x return m.query_map_point(idx, x, y); } -// deepcopy -/* -mapnik::Map map_deepcopy(mapnik::Map & m, boost::python::dict memo) -{ - // FIXME: ignore memo for now - mapnik::Map result; - mapnik::util::deepcopy(m, result); - return result; -} -*/ - void set_maximum_extent(mapnik::Map & m, boost::optional > const& box) { if (box) @@ -116,10 +105,10 @@ void set_maximum_extent(mapnik::Map & m, boost::optional > struct extract_style { - typedef mapnik::feature_type_style result_type; + typedef boost::python::tuple result_type; result_type operator() (std::map::value_type const& val) const { - return val.second; + return boost::python::make_tuple(val.first,val.second); } }; @@ -155,7 +144,7 @@ void export_map() class_("StyleRange") .def("__iter__", - range(&style_range::first, &style_range::second)) + boost::python::range(&style_range::first, &style_range::second)) ; class_("Map","The map object.",init >( diff --git a/bindings/python/mapnik_markers_symbolizer.cpp b/bindings/python/mapnik_markers_symbolizer.cpp index 64f6bc394..200c44959 100644 --- a/bindings/python/mapnik_markers_symbolizer.cpp +++ b/bindings/python/mapnik_markers_symbolizer.cpp @@ -30,6 +30,8 @@ #include #include "mapnik_svg.hpp" #include "mapnik_enumeration.hpp" +#include "python_optional.hpp" + #include // for known_svg_prefix_ using mapnik::markers_symbolizer; @@ -70,16 +72,6 @@ void set_marker_type(mapnik::markers_symbolizer & symbolizer, std::string const& } - -// https://github.com/mapnik/mapnik/issues/1367 -PyObject* get_fill_opacity_impl(markers_symbolizer & sym) -{ - boost::optional fill_opacity = sym.get_fill_opacity(); - if (fill_opacity) - return ::PyFloat_FromDouble(*fill_opacity); - Py_RETURN_NONE; -} - void export_markers_symbolizer() { using namespace boost::python; @@ -119,7 +111,7 @@ void export_markers_symbolizer() &markers_symbolizer::set_opacity, "Set/get the overall opacity") .add_property("fill_opacity", - &get_fill_opacity_impl, + &markers_symbolizer::get_fill_opacity, &markers_symbolizer::set_fill_opacity, "Set/get the fill opacity") .add_property("ignore_placement", diff --git a/bindings/python/mapnik_palette.cpp b/bindings/python/mapnik_palette.cpp index 2d82c0919..d28f081c8 100644 --- a/bindings/python/mapnik_palette.cpp +++ b/bindings/python/mapnik_palette.cpp @@ -28,6 +28,9 @@ //mapnik #include +// stl +#include + static boost::shared_ptr make_palette( std::string const& palette, std::string const& format ) { mapnik::rgba_palette::palette_type type = mapnik::rgba_palette::PALETTE_RGBA; diff --git a/bindings/python/mapnik_proj_transform.cpp b/bindings/python/mapnik_proj_transform.cpp index 5b1115555..95b4408e8 100644 --- a/bindings/python/mapnik_proj_transform.cpp +++ b/bindings/python/mapnik_proj_transform.cpp @@ -27,6 +27,10 @@ // boost #include +// stl +#include + + using mapnik::proj_transform; using mapnik::projection; diff --git a/bindings/python/mapnik_python.cpp b/bindings/python/mapnik_python.cpp index 7ed80d58d..1e0db91a9 100644 --- a/bindings/python/mapnik_python.cpp +++ b/bindings/python/mapnik_python.cpp @@ -25,6 +25,9 @@ #include #include +// stl +#include + void register_cairo(); void export_color(); void export_coord(); @@ -38,8 +41,10 @@ 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(); @@ -62,6 +67,7 @@ void export_polygon_pattern_symbolizer(); void export_raster_symbolizer(); void export_text_placement(); void export_shield_symbolizer(); +void export_debug_symbolizer(); void export_font_engine(); void export_projection(); void export_proj_transform(); @@ -84,12 +90,13 @@ void export_logger(); #include #include #include -#include #include #include #include #include +#if defined(GRID_RENDERER) #include "python_grid_utils.hpp" +#endif #include "mapnik_value_converter.hpp" #include "mapnik_threads.hpp" #include "python_optional.hpp" @@ -333,11 +340,6 @@ double scale_denominator(mapnik::Map const &map, bool geographic) } // http://docs.python.org/c-api/exceptions.html#standard-exceptions -void config_error_translator(mapnik::config_error const & ex) -{ - PyErr_SetString(PyExc_RuntimeError, ex.what()); -} - void value_error_translator(mapnik::value_error const & ex) { PyErr_SetString(PyExc_ValueError, ex.what()); @@ -348,6 +350,16 @@ 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; @@ -358,7 +370,33 @@ std::string mapnik_version_string() return MAPNIK_VERSION_STRING; } -// indicator for jpeg read/write support within libmapnik +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) @@ -368,6 +406,33 @@ bool has_jpeg() #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() { @@ -403,7 +468,7 @@ bool has_pycairo() } -BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_overloads, load_map, 2, 3) +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) @@ -419,9 +484,9 @@ BOOST_PYTHON_MODULE(_mapnik) using mapnik::load_map_string; using mapnik::save_map; using mapnik::save_map_to_string; - using mapnik::render_grid; - register_exception_translator(&config_error_translator); + register_exception_translator(&standard_error_translator); + register_exception_translator(&out_of_range_error_translator); register_exception_translator(&value_error_translator); register_exception_translator(&runtime_error_translator); register_cairo(); @@ -439,8 +504,10 @@ BOOST_PYTHON_MODULE(_mapnik) 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(); @@ -458,6 +525,7 @@ BOOST_PYTHON_MODULE(_mapnik) export_raster_symbolizer(); export_text_placement(); export_shield_symbolizer(); + export_debug_symbolizer(); export_font_engine(); export_projection(); export_proj_transform(); @@ -477,7 +545,8 @@ BOOST_PYTHON_MODULE(_mapnik) ">>> clear_cache()\n" ); - def("render_grid",&render_grid, +#if defined(GRID_RENDERER) + def("render_grid",&mapnik::render_grid, ( arg("map"), arg("layer"), args("key")="__id__", @@ -485,6 +554,7 @@ BOOST_PYTHON_MODULE(_mapnik) arg("fields")=boost::python::list() ) ); +#endif def("render_to_file",&render_to_file1, "\n" @@ -569,9 +639,11 @@ BOOST_PYTHON_MODULE(_mapnik) (arg("map"),arg("image"),args("layer")) ); +#if defined(GRID_RENDERER) def("render_layer", &mapnik::render_layer_for_grid, (arg("map"),arg("grid"),args("layer"),arg("fields")=boost::python::list()) ); +#endif #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO) def("render",&render3, @@ -729,7 +801,12 @@ BOOST_PYTHON_MODULE(_mapnik) 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_jpeg, "Get tiff read/write support status"); + def("has_webp", &has_jpeg, "Get webp read/write support 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"); diff --git a/bindings/python/mapnik_query.cpp b/bindings/python/mapnik_query.cpp index f0041b8c0..3c6138a23 100644 --- a/bindings/python/mapnik_query.cpp +++ b/bindings/python/mapnik_query.cpp @@ -22,11 +22,15 @@ // boost #include +#include // mapnik #include #include +#include +#include + using mapnik::query; using mapnik::box2d; @@ -46,11 +50,30 @@ struct resolution_to_tuple } }; +struct names_to_list +{ + static PyObject* convert(std::set const& names) + { + boost::python::list l; + BOOST_FOREACH( std::string const& name, names ) + { + l.append(name); + } + return python::incref(l.ptr()); + } + + static PyTypeObject const* get_pytype() + { + return &PyList_Type; + } +}; + void export_query() { using namespace boost::python; to_python_converter (); + to_python_converter, names_to_list> (); class_("Query", "a spatial query data object", init,query::resolution_type const&,double>() ) diff --git a/bindings/python/mapnik_raster_symbolizer.cpp b/bindings/python/mapnik_raster_symbolizer.cpp index 54f66a554..20a04a3f3 100644 --- a/bindings/python/mapnik_raster_symbolizer.cpp +++ b/bindings/python/mapnik_raster_symbolizer.cpp @@ -28,18 +28,7 @@ #include #include -namespace { -// https://github.com/mapnik/mapnik/issues/1367 -PyObject* get_premultiplied_impl(mapnik::raster_symbolizer & sym) -{ - boost::optional premultiplied = sym.premultiplied(); - if (premultiplied) - return ::PyBool_FromLong(*premultiplied); - Py_RETURN_NONE; -} - -} using mapnik::raster_symbolizer; void export_raster_symbolizer() @@ -132,7 +121,7 @@ void export_raster_symbolizer() ">>> r.mesh_size = 32\n" ) .add_property("premultiplied", - &get_premultiplied_impl, + &raster_symbolizer::premultiplied, &raster_symbolizer::set_premultiplied, "Get/Set premultiplied status of the source image.\n" "Can be used to override what the source data reports (when in error)\n" diff --git a/bindings/python/mapnik_rule.cpp b/bindings/python/mapnik_rule.cpp index bad1f2639..80341ca24 100644 --- a/bindings/python/mapnik_rule.cpp +++ b/bindings/python/mapnik_rule.cpp @@ -34,7 +34,6 @@ using mapnik::rule; using mapnik::expr_node; using mapnik::expression_ptr; -using mapnik::Feature; using mapnik::point_symbolizer; using mapnik::line_symbolizer; using mapnik::line_pattern_symbolizer; diff --git a/bindings/python/mapnik_style.cpp b/bindings/python/mapnik_style.cpp index 9b1945fcd..7eb9e449b 100644 --- a/bindings/python/mapnik_style.cpp +++ b/bindings/python/mapnik_style.cpp @@ -28,7 +28,6 @@ #include #include "mapnik_enumeration.hpp" #include -#include // image_filter_grammar #include // generate_image_filters using mapnik::feature_type_style; @@ -45,18 +44,12 @@ std::string get_image_filters(feature_type_style & style) void set_image_filters(feature_type_style & style, std::string const& filters) { - std::string::const_iterator itr = filters.begin(); - std::string::const_iterator end = filters.end(); - mapnik::image_filter_grammar > filter_grammar; std::vector new_filters; - bool result = boost::spirit::qi::phrase_parse(itr,end, - filter_grammar, - boost::spirit::qi::ascii::space, - new_filters); - if (!result || itr!=end) + + bool result = parse_image_filters(filters, new_filters); + if (!result) { - throw mapnik::value_error("failed to parse image-filters: '" + std::string(itr,end) + "'"); + throw mapnik::value_error("failed to parse image-filters: '" + filters + "'"); } style.image_filters().swap(new_filters); } diff --git a/bindings/python/mapnik_text_placement.cpp b/bindings/python/mapnik_text_placement.cpp index 2cdb744fc..05201326a 100644 --- a/bindings/python/mapnik_text_placement.cpp +++ b/bindings/python/mapnik_text_placement.cpp @@ -84,7 +84,7 @@ struct NodeWrap: formatting::node, wrapper } - void apply(char_properties const& p, Feature const& feature, processed_text &output) const + void apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { python_block_auto_unblock b; this->get_override("apply")(ptr(&p), ptr(&feature), ptr(&output)); @@ -122,7 +122,7 @@ struct TextNodeWrap: formatting::text_node, wrapper } - virtual void apply(char_properties const& p, Feature const& feature, processed_text &output) const + virtual void apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { if(override o = this->get_override("apply")) { @@ -135,7 +135,7 @@ struct TextNodeWrap: formatting::text_node, wrapper } } - void default_apply(char_properties const& p, Feature const& feature, processed_text &output) const + void default_apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { formatting::text_node::apply(p, feature, output); } @@ -143,7 +143,7 @@ struct TextNodeWrap: formatting::text_node, wrapper struct FormatNodeWrap: formatting::format_node, wrapper { - virtual void apply(char_properties const& p, Feature const& feature, processed_text &output) const + virtual void apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { if(override o = this->get_override("apply")) { @@ -156,7 +156,7 @@ struct FormatNodeWrap: formatting::format_node, wrapper } } - void default_apply(char_properties const& p, Feature const& feature, processed_text &output) const + void default_apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { formatting::format_node::apply(p, feature, output); } @@ -164,7 +164,7 @@ struct FormatNodeWrap: formatting::format_node, wrapper struct ExprFormatWrap: formatting::expression_format, wrapper { - virtual void apply(char_properties const& p, Feature const& feature, processed_text &output) const + virtual void apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { if(override o = this->get_override("apply")) { @@ -177,7 +177,7 @@ struct ExprFormatWrap: formatting::expression_format, wrapper http://wiki.python.org/moin/boost.python/HowTo#A.22Raw.22_function */ - virtual void apply(char_properties const& p, Feature const& feature, processed_text &output) const + virtual void apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { if(override o = this->get_override("apply")) { @@ -214,7 +214,7 @@ struct ListNodeWrap: formatting::list_node, wrapper } } - void default_apply(char_properties const& p, Feature const& feature, processed_text &output) const + void default_apply(char_properties const& p, feature_impl const& feature, processed_text &output) const { formatting::list_node::apply(p, feature, output); } @@ -340,6 +340,11 @@ void export_text_placement() .value("CAPITALIZE",CAPITALIZE) ; + enumeration_("halo_rasterizer") + .value("FULL",HALO_RASTERIZER_FULL) + .value("FAST",HALO_RASTERIZER_FAST) + ; + class_("TextSymbolizer", init<>()) .def(init()) @@ -363,6 +368,10 @@ void export_text_placement() &text_symbolizer::clip, &text_symbolizer::set_clip, "Set/get the text geometry's clipping status") + .add_property("halo_rasterizer", + &text_symbolizer::get_halo_rasterizer, + &text_symbolizer::set_halo_rasterizer, + "Set/get the halo rasterizer method") ; diff --git a/bindings/python/mapnik_value_converter.hpp b/bindings/python/mapnik_value_converter.hpp index 47707d94e..88bf8a764 100644 --- a/bindings/python/mapnik_value_converter.hpp +++ b/bindings/python/mapnik_value_converter.hpp @@ -35,11 +35,7 @@ namespace boost { namespace python { { PyObject * operator() (mapnik::value_integer val) const { -#if PY_VERSION_HEX >= 0x03000000 - return ::PyLong_FromLong(val); -#else - return ::PyInt_FromLong(val); -#endif + return ::PyLong_FromLongLong(val); } PyObject * operator() (double val) const diff --git a/bindings/python/python_grid_utils.cpp b/bindings/python/python_grid_utils.cpp index ee6e46236..7e9e1e52f 100644 --- a/bindings/python/python_grid_utils.cpp +++ b/bindings/python/python_grid_utils.cpp @@ -20,6 +20,8 @@ * *****************************************************************************/ +#if defined(GRID_RENDERER) + // boost #include #include @@ -39,13 +41,16 @@ #include "mapnik_value_converter.hpp" #include "python_grid_utils.hpp" +// stl +#include + namespace mapnik { template void grid2utf(T const& grid_type, boost::python::list& l, - std::vector& key_order) + std::vector& key_order) { typedef std::map< typename T::lookup_type, typename T::value_type> keys_type; typedef typename keys_type::const_iterator keys_iterator; @@ -469,3 +474,5 @@ boost::python::dict render_grid(mapnik::Map const& map, } } + +#endif diff --git a/bindings/python/python_optional.hpp b/bindings/python/python_optional.hpp index 0d785b0f3..3b41ff757 100644 --- a/bindings/python/python_optional.hpp +++ b/bindings/python/python_optional.hpp @@ -22,7 +22,8 @@ #include #include -#include + +#include // boost::optional to/from converter from John Wiegley @@ -46,7 +47,7 @@ struct register_python_conversion }; template -struct python_optional : public boost::noncopyable +struct python_optional : public mapnik::noncopyable { struct optional_to_python { @@ -74,7 +75,7 @@ struct python_optional : public boost::noncopyable rvalue_from_python_stage1(source, converters); return rvalue_from_python_stage2(source, data, converters); } - return NULL; + return 0; } static void construct(PyObject * source, @@ -94,17 +95,116 @@ struct python_optional : public boost::noncopyable } }; - explicit python_optional() { + explicit python_optional() + { register_python_conversion, optional_to_python, optional_from_python>(); } }; -/** This class works around a bug in boost python. +// to/from boost::optional +template <> +struct python_optional : public mapnik::noncopyable +{ + struct optional_to_python + { + static PyObject * convert(const boost::optional& value) + { + return (value ? PyFloat_FromDouble(*value) : + boost::python::detail::none()); + } + }; - See http://osdir.com/ml/python.c++/2003-11/msg00158.html -*/ -template + 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 > *) + data)->storage.bytes; + if (source == Py_None) // == None + new (storage) boost::optional(); // A Boost uninitialized value + else + new (storage) boost::optional(PyFloat_AsDouble(source)); + data->convertible = storage; + } + }; + + explicit python_optional() + { + register_python_conversion, + optional_to_python, optional_from_python>(); + } +}; + +// to/from boost::optional +template <> +struct python_optional : public mapnik::noncopyable +{ + struct optional_to_python + { + static PyObject * convert(const boost::optional& 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 > *) + data)->storage.bytes; + if (source == Py_None) // == None + new (storage) boost::optional(); // A Boost uninitialized value + else + { + new (storage) boost::optional(source == Py_True ? true : false); + } + data->convertible = storage; + } + }; + + explicit python_optional() + { + register_python_conversion, + optional_to_python, optional_from_python>(); + } +}; + + +// This class works around a feature in boost python. +// See http://osdir.com/ml/python.c++/2003-11/msg00158.html + +template class class_with_converter : public boost::python::class_ { public: @@ -128,7 +228,7 @@ public: : boost::python::class_(name, doc, i) { } template - self& def_readwrite_convert(char const* name, D const& d, char const* doc=0) + 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()), diff --git a/demo/c++/Makefile b/demo/c++/Makefile index d30b71b40..dbd425380 100644 --- a/demo/c++/Makefile +++ b/demo/c++/Makefile @@ -1,4 +1,4 @@ -CXXFLAGS = $(shell mapnik-config --cflags) +CXXFLAGS = $(shell mapnik-config --includes --defines --cxxflags --dep-includes) LDFLAGS = $(shell mapnik-config --libs --dep-libs --ldflags) OBJ = rundemo.o @@ -13,8 +13,15 @@ $(BIN) : $(OBJ) .c.o : $(CXX) -c $(CXXFLAGS) $< +gyp: + rm -rf ./build + gyp rundemo.gyp --depth=. -f make --generator-output=./build/ + make -C ./build + build/out/Release/rundemo `mapnik-config --prefix` + .PHONY : clean clean: rm -f $(OBJ) rm -f $(BIN) + rm -f ./build \ No newline at end of file diff --git a/demo/c++/README.md b/demo/c++/README.md new file mode 100644 index 000000000..daa4198c1 --- /dev/null +++ b/demo/c++/README.md @@ -0,0 +1,81 @@ +## rundemo.cpp + +This directory contains a simple c++ program demonstrating the Mapnik C++ API. It mimics the python 'rundemo.py' example with a couple exceptions. + +If building on unix you can have this program automatically build by configuring Mapnik like: + + ./configure DEMO=True + +However, this example code also should be able to be built standalone. + +The following notes describe how to do that on various operating systems. + +## Depends + + - Mapnik library development headers + - `mapnik-config` on unix and `mapnik-config.bat` on windows + +### Unix + +On OS X and Linux you also need `make`. + +### Windows + +On windows, additional dependencies to build are: + + - MSVS 2010 with C++ compiler + - Python 2.x + - gyp: https://code.google.com/p/gyp | https://github.com/springmeyer/hello-gyp + +`mapnik-config.bat` should come with your Mapnik installation. + +First confirm it is on your path: + + mapnik-config # should give usage + +To install gyp, which is pure python do: + + svn checkout http://gyp.googlecode.com/svn/trunk/ gyp + cd gyp + python setup.py install + +If you do not have svn installed you can grab gyp from: + + https://github.com/TooTallNate/node-gyp/archive/master.zip + # unzip and extract the 'gyp' subfolder then do + cd gyp + python setup.py install + +## Building the demo + +### Unix + +Simply type: + + make + +Then to run do: + + ./rundemo `mapnik-config --prefix` + +On OS X you can also create an xcode project: + + gyp rundemo.gyp --depth=. -f xcode --generator-output=./build/ + xcodebuild -project ./build/rundemo.xcodeproj + ./build/out/Release/rundemo `mapnik-config --prefix` + + +### Windows + +First you need to build the visual studio solution with gyp: + + C:\Python27\python.exe c:\Python27\Scripts\gyp rundemo.gyp --depth=. -f msvs -G msvs_version=2010 + +Then you can compile with `msbuild`: + + msbuild rundemo.sln /p:Configuration="Release" /p:Platform=Win32 + +Then run it! + + for /f %i in ('mapnik-config --prefix') do set MAPNIK_PREFIX=%i + Release\rundemo.exe %MAPNIK_PREFIX% diff --git a/demo/c++/build.py b/demo/c++/build.py index b36a95840..403576d4d 100644 --- a/demo/c++/build.py +++ b/demo/c++/build.py @@ -34,13 +34,16 @@ demo_env = env.Clone() demo_env['CXXFLAGS'] = copy(env['LIBMAPNIK_CXXFLAGS']) +demo_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES']) if env['HAS_CAIRO']: demo_env.PrependUnique(CPPPATH=env['CAIRO_CPPPATHS']) - demo_env.Append(CXXFLAGS = '-DHAVE_CAIRO') + demo_env.Append(CPPDEFINES = '-DHAVE_CAIRO') -libraries = copy(env['LIBMAPNIK_LIBS']) -libraries.append('mapnik') +libraries = ['mapnik'] +libraries.extend(copy(env['LIBMAPNIK_LIBS'])) +if env['RUNTIME_LINK'] == 'static' and env['PLATFORM'] == 'Linux': + libraries.append('dl') rundemo = demo_env.Program('rundemo', source, LIBS=libraries, LINKFLAGS=env["CUSTOM_LDFLAGS"]) diff --git a/demo/c++/common.gypi b/demo/c++/common.gypi new file mode 100644 index 000000000..2dd800c78 --- /dev/null +++ b/demo/c++/common.gypi @@ -0,0 +1,42 @@ +{ + 'variables': { + 'conditions': [ + ['OS == "mac"', { + 'target_arch%': 'x64' + }, { + 'target_arch%': 'ia32' + }] + ] + }, + 'target_defaults': { + 'default_configuration': 'Release', + 'defines': [ ], + 'conditions': [ + ['OS == "mac"', { + 'defines': [ 'DARWIN' ] + }, { + 'defines': [ 'LINUX' ] + }], + ['OS == "mac" and target_arch == "x64"', { + 'xcode_settings': { + 'ARCHS': [ 'x86_64' ] + }, + }] + ], + 'configurations': { + 'Debug': { + 'cflags': [ '-g', '-O0' ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ '-g', '-O0' ] + } + }, + 'Release': { + 'cflags': [ '-O3' ], + 'defines': [ 'NDEBUG' ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ '-O3' ] + } + } + } + } +} \ No newline at end of file diff --git a/demo/c++/readme.txt b/demo/c++/readme.txt deleted file mode 100644 index c9d546bc5..000000000 --- a/demo/c++/readme.txt +++ /dev/null @@ -1,20 +0,0 @@ -This directory contains a simple c++ program demonstrating the Mapnik C++ API. It mimics the python 'rundemo.py' example with a couple exceptions. - -To build it re-configure SCons with DEMO=True then rebuild:: - - $ python scons/scons.py configure DEMO=True - $ python scons/scons.py - - -The sample program will be compiled (but not installed). - - -To run:: - - $ cd demo/c++ - $ ./rundemo /usr/local/lib/mapnik - -For more detailed comments have a look in demo/python/rundemo.py - -Have fun! -Artem. diff --git a/demo/c++/rundemo.cpp b/demo/c++/rundemo.cpp index 1d57495d0..839ab154f 100644 --- a/demo/c++/rundemo.cpp +++ b/demo/c++/rundemo.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #if defined(HAVE_CAIRO) #include @@ -313,11 +312,6 @@ int main ( int argc , char** argv) #endif } - catch ( const mapnik::config_error & ex ) - { - std::cerr << "### Configuration error: " << ex.what() << std::endl; - return EXIT_FAILURE; - } catch ( const std::exception & ex ) { std::cerr << "### std::exception: " << ex.what() << std::endl; diff --git a/demo/c++/rundemo.gyp b/demo/c++/rundemo.gyp new file mode 100644 index 000000000..e54ae121c --- /dev/null +++ b/demo/c++/rundemo.gyp @@ -0,0 +1,48 @@ +{ + 'includes': [ 'common.gypi' ], + 'default_configuration': 'Release', + 'targets': [ + { + 'target_name': 'rundemo', + 'type': 'executable', + 'sources': [ + 'rundemo.cpp', + ], + 'conditions': [ + [ 'OS=="mac"', { + 'libraries': [ + '-lmapnik', + '-undefined dynamic_lookup' + ], + 'xcode_settings': { + 'OTHER_CPLUSPLUSFLAGS':[ + ' - - charplacement - charplacement - - 1 - 1.00000 - 2.00000 - 1.00000 - 5.00000 - - - NAME - NAME - String - 0 - - - CLASS - CLASS - String - 0 - - - diff --git a/demo/data/test/raw/charplacement.gml b/demo/data/test/raw/charplacement.gml deleted file mode 100644 index 8de776840..000000000 --- a/demo/data/test/raw/charplacement.gml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - 00 - 13-13 - - - - - - 2,-1 1,-3 2,-5 - Road Name - TRIANGLE - - - 3,-1 4,-3 3,-5 - Road Name - TRIANGLE - - - - - 1,-12 13,-12 - - Road Name - STRAIGHT - - - - 1,-13 2,-13 5,-13 10,-13 13,-13 - - Road Name - STRAIGHT - - - - 6,-1 5,-3 5,-5 - Road Name - BEND - - - 7,-1 8,-3 8,-5 - Road Name - BEND - - - 5,-6 5,-8 6,-10 - Road Name - BEND - - - 8,-6 8,-8 7,-10 - Road Name - BEND - - - - 10.055915,-1.00031738281 10.6649858,-1.077712483 11.274056,-1.26950068 11.77921,-1.55298308 12.191993,-1.92815928 12.51529,-2.369132 12.746218,-2.8329032 12.884774,-3.2968745 12.930959,-3.875339 - Road Name - CURVE - - - 10.0555,-8.875339 10.6645708,-8.7979439 11.273641,-8.6061557 11.778795,-8.3226733 12.191578,-7.9474971 12.514875,-7.5065244 12.745803,-7.0427532 12.884359,-6.5787819 12.930544,-6.0003174 - Road Name - CURVE - - - - -9.055915,-2.00031738281 9.6649858,-2.077712483 10.274056,-2.26950068 10.77921,-2.55298308 11.191993,-2.92815928 11.51529,-3.369132 11.746218,-3.8329032 11.884774,-4.2968745 11.930959,-4.875339 -11.930544,-5.0003174 11.884359,-5.5787819 11.745803,-6.0427532 11.514875,-6.5065244 11.191578,-6.9474971 10.778795,-7.3226733 10.273641,-7.6061557 9.6645708,-7.7979439 9.0555,-7.875339 - - Road Name - CURVE - - - - -9.0435048,-10.5550195 9.480786,-10.2191668 9.963148,-10.0731439 10.540222,-10.2495527 10.968444,-10.525815 11.419238,-10.8336443 12.01882,-10.9565825 12.559787,-10.7996079 12.956495,-10.4089966 - - Road Name - SQUIGGLE - - - - - 1,-9 1.4,-10 1.8,-9 2.2,-10 2.6,-9 3.0,-10 3.4,-9 3.8,-10 4.2,-9 4.6,-10 - - Long ZigZag Road Name - ZIGZAG - - - - diff --git a/demo/data/test/raw/charplacement.xsd b/demo/data/test/raw/charplacement.xsd deleted file mode 100644 index 345905d06..000000000 --- a/demo/data/test/raw/charplacement.xsd +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demo/data/test/raw/displacement.gfs b/demo/data/test/raw/displacement.gfs deleted file mode 100644 index 3034d7109..000000000 --- a/demo/data/test/raw/displacement.gfs +++ /dev/null @@ -1,25 +0,0 @@ - - - displacement - displacement - - 1 - 1.00000 - 2.00000 - 1.00000 - 5.00000 - - - NAME - NAME - String - 0 - - - CLASS - CLASS - String - 0 - - - diff --git a/demo/data/test/raw/displacement.gml b/demo/data/test/raw/displacement.gml deleted file mode 100644 index 9b3a007ce..000000000 --- a/demo/data/test/raw/displacement.gml +++ /dev/null @@ -1,173 +0,0 @@ - - - - - 00 - 13-13 - - - - - - 1,-3 1,-2 - Road - CLOCKWISE - - - 1,-2 2,-1 - Road - CLOCKWISE - - - 2,-1 3,-1 - Road - CLOCKWISE - - - 3,-1 4,-2 - Road - CLOCKWISE - - - 4,-2 4,-3 - Road - CLOCKWISE - - - 4,-3 3,-4 - Road - CLOCKWISE - - - 3,-4 2,-4 - Road - CLOCKWISE - - - 2,-4 1,-3 - Road - CLOCKWISE - - - - 5,-3 6,-4 - Road - ANTICLOCKWISE - - - 6,-4 7,-4 - Road - ANTICLOCKWISE - - - 7,-4 8,-3 - Road - ANTICLOCKWISE - - - 8,-3 8,-2 - Road - ANTICLOCKWISE - - - 8,-2 7,-1 - Road - ANTICLOCKWISE - - - 7,-1 6,-1 - Road - ANTICLOCKWISE - - - 6,-1 5,-2 - Road - ANTICLOCKWISE - - - 5,-2 5,-3 - Road - ANTICLOCKWISE - - - - - 1,-6.5 2,-5.5 3,-5 4,-5 5,-5.5 6,-6.5 - - Long Road Name To Go Around The Whole Curve! - CURVE - - - - - 1,-7 2,-8 3,-8.5 4,-8.5 5,-8 6,-7 - - Long Road Name To Go Around The Whole Curve! - CURVE - - - - - 3,-8.5 2,-9.5 1.5,-10.5 1.5,-11.5 2,-12.5 3,-13.5 - - Long Road Name To Go Around The Whole Curve! - VERTCURVE - - - - 4,-8.5 5,-9.5 5.5,-10.5 5.5,-11.5 5,-12.5 4,-13.5 - - Long Road Name To Go Around The Whole Curve! - VERTCURVE - - - - - 9.2,-4 9,-3 10,-3 10.2,-4 - - Road Name - PARALLELOGRAM - - - - 9,-2 9.2,-1 10.2,-1 10,-2 - - Road Name - PARALLELOGRAM - - - - - 11,-1 11,-2 12,-2 - - Road Name - CORNER - - - - 11,-4 12,-4 12,-3 - - Road Name - CORNER - - - - 12.5,-1 13.5,-1 13.5,-2 - - Road Name - CORNER - - - - 12.5,-4 12.5,-3 13.5,-3 - - Road Name - CORNER - - - - diff --git a/demo/data/test/raw/displacement.xsd b/demo/data/test/raw/displacement.xsd deleted file mode 100644 index 66f9b90f0..000000000 --- a/demo/data/test/raw/displacement.xsd +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demo/data/test/raw/overlap.gfs b/demo/data/test/raw/overlap.gfs deleted file mode 100644 index 67e8c818e..000000000 --- a/demo/data/test/raw/overlap.gfs +++ /dev/null @@ -1,25 +0,0 @@ - - - overlap - overlap - - 1 - 1.00000 - 2.00000 - 1.00000 - 5.00000 - - - NAME - NAME - String - 0 - - - CLASS - CLASS - String - 0 - - - diff --git a/demo/data/test/raw/overlap.gml b/demo/data/test/raw/overlap.gml deleted file mode 100644 index 5fe0e85df..000000000 --- a/demo/data/test/raw/overlap.gml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - 00 - 13-13 - - - - - - 1,-1 1,-10 - Road Name - NETWORK - - - 1,-3 7,-3 - Road Name - NETWORK - - - 7,-3 7,-7 - Road Name - NETWORK - - - 3,-2 3,-8 - Road Name - NETWORK - - - 7,-7 1,-7 - Road Name - NETWORK - - - 5,-2 5,-8 - Road Name - NETWORK - - - - 8,-3 12,-3 - Road Name - CROSS - - - 10,-1 10,-5 - Road Name - CROSS - - - - - 10,-9 13,-9 13,-11 11,-11 11,-8 - - Road Name - SELFOVERLAP - - - - 4,-9 4,-13 - Road Name - NETWORK2 - - - 8,-9 8,-13 - Road Name - NETWORK2 - - - 1,-11 9,-11 - Road Name - NETWORK2 - - - 2,-9 2,-13 - Road Name - NETWORK2 - - - 6,-9 6,-13 - Road Name - NETWORK2 - - - - - 8.8,-6 8.8,-8 - Long Road Name - BENDOVER - - - 8,-6 8,-7 10,-7 10,-8 - Long Road Name - BENDUNDER - - - - 12.2,-6 12.2,-8 - Long Road Name - BENDOVER - - - 11,-6 11,-7 13,-7 13,-8 - Long Road Name - BENDUNDER - - - - 12.2,-3.5 12.2,-5.5 - Long Road Name - BENDOVER - - - 11,-4.5 13,-4.5 - Long Road Name - BENDUNDER - - - - - diff --git a/demo/data/test/raw/overlap.xsd b/demo/data/test/raw/overlap.xsd deleted file mode 100644 index 1a7cf35a2..000000000 --- a/demo/data/test/raw/overlap.xsd +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demo/data/test/raw/textspacing.gfs b/demo/data/test/raw/textspacing.gfs deleted file mode 100644 index c589181eb..000000000 --- a/demo/data/test/raw/textspacing.gfs +++ /dev/null @@ -1,25 +0,0 @@ - - - textspacing - textspacing - - 1 - 1.00000 - 2.00000 - 1.00000 - 5.00000 - - - NAME - NAME - String - 0 - - - CLASS - CLASS - String - 0 - - - diff --git a/demo/data/test/raw/textspacing.gml b/demo/data/test/raw/textspacing.gml deleted file mode 100644 index 62fff2415..000000000 --- a/demo/data/test/raw/textspacing.gml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - 00 - 13-13 - - - - - - 2,-1 1,-3 2,-5 - Road Name - TRIANGLE - - - 3,-1 4,-3 3,-5 - Road Name - TRIANGLE - - - - 1,-7 2,-7 - Road Name - STRAIGHT - - - 1,-8 3,-8 - Road Name - STRAIGHT - - - 1,-9 4,-9 - Road Name - STRAIGHT - - - 1,-10 5,-10 - Road Name - STRAIGHT - - - - 1,-11 7,-11 - Road Name - STRAIGHT - - - - 1,-12 13,-12 - - Road Name - STRAIGHT - - - - 1,-13 2,-13 5,-13 10,-13 13,-13 - - Road Name - STRAIGHT - - - - 6,-1 5,-3 5,-5 - Road Name - BEND - - - 7,-1 8,-3 8,-5 - Road Name - BEND - - - 5,-6 5,-8 6,-10 - Road Name - BEND - - - 8,-6 8,-8 7,-10 - Road Name - BEND - - - - 10.055915,-1.00031738281 10.6649858,-1.077712483 11.274056,-1.26950068 11.77921,-1.55298308 12.191993,-1.92815928 12.51529,-2.369132 12.746218,-2.8329032 12.884774,-3.2968745 12.930959,-3.875339 - Road Name - CURVE - - - 10.0555,-8.875339 10.6645708,-8.7979439 11.273641,-8.6061557 11.778795,-8.3226733 12.191578,-7.9474971 12.514875,-7.5065244 12.745803,-7.0427532 12.884359,-6.5787819 12.930544,-6.0003174 - Road Name - CURVE - - - - -9.055915,-2.00031738281 9.6649858,-2.077712483 10.274056,-2.26950068 10.77921,-2.55298308 11.191993,-2.92815928 11.51529,-3.369132 11.746218,-3.8329032 11.884774,-4.2968745 11.930959,-4.875339 -11.930544,-5.0003174 11.884359,-5.5787819 11.745803,-6.0427532 11.514875,-6.5065244 11.191578,-6.9474971 10.778795,-7.3226733 10.273641,-7.6061557 9.6645708,-7.7979439 9.0555,-7.875339 - - Road Name - CURVE - - - - -9.0435048,-10.5550195 9.480786,-10.2191668 9.963148,-10.0731439 10.540222,-10.2495527 10.968444,-10.525815 11.419238,-10.8336443 12.01882,-10.9565825 12.559787,-10.7996079 12.956495,-10.4089966 - - Road Name - SQUIGGLE - - - - diff --git a/demo/data/test/raw/textspacing.xsd b/demo/data/test/raw/textspacing.xsd deleted file mode 100644 index 2e6a4d755..000000000 --- a/demo/data/test/raw/textspacing.xsd +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demo/data/test/readme.txt b/demo/data/test/readme.txt deleted file mode 100644 index c1dc62efd..000000000 --- a/demo/data/test/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -These files are for testing various rendering parts of mapnik, they have been created by hand. -The raw files are in the raw/ folder (they were created with inkscape to assist!) -Run the regenerate.sh script to regenerate the shape files from the gml files, this requires ogr2ogr to run. diff --git a/demo/data/test/regenerate.sh b/demo/data/test/regenerate.sh deleted file mode 100755 index de1b5babe..000000000 --- a/demo/data/test/regenerate.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -rm -f textspacing.shp textspacing.shx textspacing.dbf -ogr2ogr -f "ESRI Shapefile" textspacing raw/textspacing.gml -mv textspacing/* ./ -rmdir textspacing - -rm -f overlap.shp overlap.shx overlap.dbf -ogr2ogr -f "ESRI Shapefile" overlap raw/overlap.gml -mv overlap/* ./ -rmdir overlap - -rm -f displacement.shp displacement.shx displacement.dbf -ogr2ogr -f "ESRI Shapefile" displacement raw/displacement.gml -mv displacement/* ./ -rmdir displacement - -rm -f charplacement.shp charplacement.shx charplacement.dbf -ogr2ogr -f "ESRI Shapefile" charplacement raw/charplacement.gml -mv charplacement/* ./ -rmdir charplacement diff --git a/demo/viewer/main.cpp b/demo/viewer/main.cpp index 73af0c95c..7bd6b3de8 100644 --- a/demo/viewer/main.cpp +++ b/demo/viewer/main.cpp @@ -19,15 +19,15 @@ // qt -#include +#include #include #include #include #include #include "mainwindow.hpp" + // boost #include -#include int main( int argc, char **argv ) diff --git a/demo/viewer/mainwindow.cpp b/demo/viewer/mainwindow.cpp index 996138678..e87e7a0d4 100644 --- a/demo/viewer/mainwindow.cpp +++ b/demo/viewer/mainwindow.cpp @@ -32,7 +32,10 @@ #include #include #include - +#include +#include +#include +#include // mapnik #ifndef Q_MOC_RUN // QT moc chokes on BOOST_JOIN diff --git a/demo/viewer/mainwindow.hpp b/demo/viewer/mainwindow.hpp index 99936da73..f5f01863f 100644 --- a/demo/viewer/mainwindow.hpp +++ b/demo/viewer/mainwindow.hpp @@ -22,7 +22,6 @@ #define MAINWINDOW_HPP #include -#include #include #include #include @@ -78,7 +77,6 @@ private: LayerTab *layerTab_; StyleTab * styleTab_; MapWidget * mapWidget_; - QPrinter printer; //actions QList exportAsActs; QActionGroup *toolsGroup; diff --git a/demo/viewer/mapwidget.cpp b/demo/viewer/mapwidget.cpp index ef9072331..93be08351 100644 --- a/demo/viewer/mapwidget.cpp +++ b/demo/viewer/mapwidget.cpp @@ -20,11 +20,12 @@ #include +#define BOOST_CHRONO_HEADER_ONLY +#include #include #include #include -#include #include #include #include @@ -502,7 +503,10 @@ void render_agg(mapnik::Map const& map, double scaling_factor, QPixmap & pix) try { - ren.apply(); + { + boost::timer::auto_cpu_timer t; + ren.apply(); + } QImage image((uchar*)buf.raw_data(),width,height,QImage::Format_ARGB32); pix = QPixmap::fromImage(image.rgbSwapped()); } @@ -523,42 +527,7 @@ void render_agg(mapnik::Map const& map, double scaling_factor, QPixmap & pix) void render_grid(mapnik::Map const& map, double scaling_factor, QPixmap & pix) { - unsigned width=map.width(); - unsigned height=map.height(); - - mapnik::grid buf(width,height,"F_CODE", 1); - mapnik::grid_renderer ren(map,buf,scaling_factor); - - try - { - ren.apply(); - mapnik::value_integer * imdata = static_cast(buf.raw_data()); - - // Not sure how to display long long values ?? - //QImage image(width,height,QImage::Format_RGB32); - //for (unsigned i = 0 ; i < height ; ++i) - //{ - // for (unsigned j = 0 ; j < width ; ++j) - // { - // image.setPixel(j,i,qRgb((uint8_t)(imdata[i*width+j]>>8), - // (uint8_t)(imdata[i*width+j+1]>>8), - // (uint8_t)(imdata[i*width+j+2]>>8))); - // } - //} - //pix = QPixmap::fromImage(image); - } - catch (mapnik::config_error & ex) - { - std::cerr << ex.what() << std::endl; - } - catch (const std::exception & ex) - { - std::cerr << "exception: " << ex.what() << std::endl; - } - catch (...) - { - std::cerr << "Unknown exception caught!\n"; - } + std::cerr << "Not supported" << std::endl; } diff --git a/demo/viewer/viewer.pro b/demo/viewer/viewer.pro index 048cfad9c..a19bc9c95 100644 --- a/demo/viewer/viewer.pro +++ b/demo/viewer/viewer.pro @@ -2,11 +2,13 @@ # Mapnik viewer - Copyright (C) 2007 Artem Pavlenko ###################################################################### TEMPLATE = app +QT += core gui widgets QMAKE_CXX = clang++ -QMAKE_CXXFLAGS += $$system(mapnik-config --cflags) +QMAKE_CXXFLAGS += $$system(mapnik-config --cxxflags) +QMAKE_CXXFLAGS += $$system(mapnik-config --includes --dep-includes) QMAKE_LFLAGS += $$system(mapnik-config --libs) QMAKE_LFLAGS += $$system(mapnik-config --ldflags --dep-libs) - +QMAKE_LFLAGS += -lboost_timer # Input CONFIG += qt debug_and_release @@ -19,17 +21,17 @@ HEADERS += mainwindow.hpp \ layerwidget.hpp \ layerlistmodel.hpp \ layerdelegate.hpp \ - styles_model.hpp + styles_model.hpp HEADERS += about_dialog.hpp \ info_dialog.hpp \ layer_info_dialog.hpp SOURCES += main.cpp \ - mainwindow.cpp \ + mainwindow.cpp \ mapwidget.cpp \ layerwidget.cpp \ - layerlistmodel.cpp \ + layerlistmodel.cpp \ layerdelegate.cpp \ styles_model.cpp diff --git a/deps/agg/include/agg_alpha_mask_u8.h b/deps/agg/include/agg_alpha_mask_u8.h index e301c1008..ef7f32980 100644 --- a/deps/agg/include/agg_alpha_mask_u8.h +++ b/deps/agg/include/agg_alpha_mask_u8.h @@ -19,7 +19,7 @@ #ifndef AGG_ALPHA_MASK_U8_INCLUDED #define AGG_ALPHA_MASK_U8_INCLUDED -#include +#include #include "agg_basics.h" #include "agg_rendering_buffer.h" diff --git a/deps/agg/include/agg_arc.h b/deps/agg/include/agg_arc.h index 17e1d4347..8ffb559ed 100644 --- a/deps/agg/include/agg_arc.h +++ b/deps/agg/include/agg_arc.h @@ -20,7 +20,7 @@ #ifndef AGG_ARC_INCLUDED #define AGG_ARC_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_array.h b/deps/agg/include/agg_array.h index 8d5668384..7c20271b2 100644 --- a/deps/agg/include/agg_array.h +++ b/deps/agg/include/agg_array.h @@ -15,8 +15,8 @@ #ifndef AGG_ARRAY_INCLUDED #define AGG_ARRAY_INCLUDED -#include -#include +#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_basics.h b/deps/agg/include/agg_basics.h index cd84c5f6d..65b47893f 100644 --- a/deps/agg/include/agg_basics.h +++ b/deps/agg/include/agg_basics.h @@ -16,7 +16,7 @@ #ifndef AGG_BASICS_INCLUDED #define AGG_BASICS_INCLUDED -#include +#include #include "agg_config.h" //---------------------------------------------------------AGG_CUSTOM_ALLOCATOR diff --git a/deps/agg/include/agg_color_rgba.h b/deps/agg/include/agg_color_rgba.h index 06ab5fee1..199537454 100644 --- a/deps/agg/include/agg_color_rgba.h +++ b/deps/agg/include/agg_color_rgba.h @@ -24,7 +24,7 @@ #ifndef AGG_COLOR_RGBA_INCLUDED #define AGG_COLOR_RGBA_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_conv_clipper.h b/deps/agg/include/agg_conv_clipper.h index 3ac9d951e..2627cec05 100755 --- a/deps/agg/include/agg_conv_clipper.h +++ b/deps/agg/include/agg_conv_clipper.h @@ -1,312 +1,295 @@ -/******************************************************************************* - * * - * 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 -#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 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 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 m_vertex_accumulator; - ClipperLib::Polygons m_poly_a; - ClipperLib::Polygons m_poly_b; - ClipperLib::Polygons 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(source_a_type &a, - clipper_op_e op = clipper_and, - clipper_PolyFillType subjFillType = clipper_non_zero, - clipper_PolyFillType clipFillType = clipper_non_zero, - int scaling_factor = 6) : - m_src_a(&a), - 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() - { - } - unsigned type() const { return m_src_a->type(); } - 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::Polygons &p); - - template void add(VS &src, ClipperLib::Polygons &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 - void conv_clipper::start_extracting() - { - m_status = status_move_to; - m_contour = -1; - m_vertex = -1; - } - //------------------------------------------------------------------------------ - - template - void conv_clipper::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.AddPolygons( m_poly_a , ClipperLib::ptSubject ); - m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); - m_clipper.Execute( ClipperLib::ctUnion , m_result , pftSubj, pftClip); - break; - } - case clipper_and: - { - m_clipper.AddPolygons( m_poly_a , ClipperLib::ptSubject ); - m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); - m_clipper.Execute( ClipperLib::ctIntersection , m_result, pftSubj, pftClip ); - break; - } - case clipper_xor: - { - m_clipper.AddPolygons( m_poly_a , ClipperLib::ptSubject ); - m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); - m_clipper.Execute( ClipperLib::ctXor , m_result, pftSubj, pftClip ); - break; - } - case clipper_a_minus_b: - { - m_clipper.AddPolygons( m_poly_a , ClipperLib::ptSubject ); - m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); - m_clipper.Execute( ClipperLib::ctDifference , m_result, pftSubj, pftClip ); - break; - } - case clipper_b_minus_a: - { - m_clipper.AddPolygons( m_poly_b , ClipperLib::ptSubject ); - m_clipper.AddPolygons( m_poly_a , ClipperLib::ptClip ); - m_clipper.Execute( ClipperLib::ctDifference , m_result, pftSubj, pftClip ); - break; - } - } - start_extracting(); - } - //------------------------------------------------------------------------------ - - template - void conv_clipper::end_contour( ClipperLib::Polygons &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 - void conv_clipper::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 - bool conv_clipper::next_contour() - { - m_contour++; - if(m_contour >= (int)m_result.size()) return false; - m_vertex =-1; - return true; - } -//------------------------------------------------------------------------------ - - template - bool conv_clipper::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 - unsigned conv_clipper::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 +/******************************************************************************* +* * +* 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 +#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 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 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 m_vertex_accumulator; + ClipperLib::Polygons m_poly_a; + ClipperLib::Polygons m_poly_b; + ClipperLib::Polygons 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::Polygons &p); + + template void add(VS &src, ClipperLib::Polygons &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 + void conv_clipper::start_extracting() + { + m_status = status_move_to; + m_contour = -1; + m_vertex = -1; + } + //------------------------------------------------------------------------------ + + template + void conv_clipper::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.AddPolygons( m_poly_a , ClipperLib::ptSubject ); + m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); + m_clipper.Execute( ClipperLib::ctUnion , m_result , pftSubj, pftClip); + break; + } + case clipper_and: + { + m_clipper.AddPolygons( m_poly_a , ClipperLib::ptSubject ); + m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); + m_clipper.Execute( ClipperLib::ctIntersection , m_result, pftSubj, pftClip ); + break; + } + case clipper_xor: + { + m_clipper.AddPolygons( m_poly_a , ClipperLib::ptSubject ); + m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); + m_clipper.Execute( ClipperLib::ctXor , m_result, pftSubj, pftClip ); + break; + } + case clipper_a_minus_b: + { + m_clipper.AddPolygons( m_poly_a , ClipperLib::ptSubject ); + m_clipper.AddPolygons( m_poly_b , ClipperLib::ptClip ); + m_clipper.Execute( ClipperLib::ctDifference , m_result, pftSubj, pftClip ); + break; + } + case clipper_b_minus_a: + { + m_clipper.AddPolygons( m_poly_b , ClipperLib::ptSubject ); + m_clipper.AddPolygons( m_poly_a , ClipperLib::ptClip ); + m_clipper.Execute( ClipperLib::ctDifference , m_result, pftSubj, pftClip ); + break; + } + } + start_extracting(); + } + //------------------------------------------------------------------------------ + + template + void conv_clipper::end_contour( ClipperLib::Polygons &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 + void conv_clipper::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 + bool conv_clipper::next_contour() + { + m_contour++; + if(m_contour >= (int)m_result.size()) return false; + m_vertex =-1; + return true; +} +//------------------------------------------------------------------------------ + + template + bool conv_clipper::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 + unsigned conv_clipper::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_gpc.h b/deps/agg/include/agg_conv_gpc.h index 2acada342..a1f7ba218 100644 --- a/deps/agg/include/agg_conv_gpc.h +++ b/deps/agg/include/agg_conv_gpc.h @@ -24,7 +24,7 @@ #ifndef AGG_CONV_GPC_INCLUDED #define AGG_CONV_GPC_INCLUDED -#include +#include #include "agg_basics.h" #include "agg_array.h" diff --git a/deps/agg/include/agg_dda_line.h b/deps/agg/include/agg_dda_line.h index f589e76b8..0bcde5831 100644 --- a/deps/agg/include/agg_dda_line.h +++ b/deps/agg/include/agg_dda_line.h @@ -20,7 +20,7 @@ #ifndef AGG_DDA_LINE_INCLUDED #define AGG_DDA_LINE_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_ellipse.h b/deps/agg/include/agg_ellipse.h index e78ce27dd..82b9e74d9 100644 --- a/deps/agg/include/agg_ellipse.h +++ b/deps/agg/include/agg_ellipse.h @@ -21,7 +21,7 @@ #define AGG_ELLIPSE_INCLUDED #include "agg_basics.h" -#include +#include namespace agg { diff --git a/deps/agg/include/agg_font_cache_manager.h b/deps/agg/include/agg_font_cache_manager.h index fe9a9280f..fc1249bd4 100644 --- a/deps/agg/include/agg_font_cache_manager.h +++ b/deps/agg/include/agg_font_cache_manager.h @@ -16,7 +16,7 @@ #ifndef AGG_FONT_CACHE_MANAGER_INCLUDED #define AGG_FONT_CACHE_MANAGER_INCLUDED -#include +#include #include "agg_array.h" namespace agg diff --git a/deps/agg/include/agg_gamma_functions.h b/deps/agg/include/agg_gamma_functions.h index 45facac00..619ef95b4 100644 --- a/deps/agg/include/agg_gamma_functions.h +++ b/deps/agg/include/agg_gamma_functions.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. // @@ -16,7 +16,7 @@ #ifndef AGG_GAMMA_FUNCTIONS_INCLUDED #define AGG_GAMMA_FUNCTIONS_INCLUDED -#include +#include #include "agg_basics.h" namespace agg @@ -40,6 +40,7 @@ namespace agg double operator() (double x) const { + if (x == 0.0) return 0.0; return pow(x, m_gamma); } @@ -85,7 +86,11 @@ namespace agg { if(x < m_start) return 0.0; if(x > m_end) return 1.0; - return (x - m_start) / (m_end - m_start); + double delta = m_end - m_start; + // avoid nan from potential zero division + // https://github.com/mapnik/mapnik/issues/761 + if (delta <= 0.0) return 0.0; + return (x - m_start) / delta; } private: @@ -118,6 +123,3 @@ namespace agg } #endif - - - diff --git a/deps/agg/include/agg_gamma_lut.h b/deps/agg/include/agg_gamma_lut.h index c3e8dfc13..b366ae30d 100644 --- a/deps/agg/include/agg_gamma_lut.h +++ b/deps/agg/include/agg_gamma_lut.h @@ -16,7 +16,7 @@ #ifndef AGG_GAMMA_LUT_INCLUDED #define AGG_GAMMA_LUT_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_glyph_raster_bin.h b/deps/agg/include/agg_glyph_raster_bin.h index b0bf858ef..720b51832 100644 --- a/deps/agg/include/agg_glyph_raster_bin.h +++ b/deps/agg/include/agg_glyph_raster_bin.h @@ -16,7 +16,7 @@ #ifndef AGG_GLYPH_RASTER_BIN_INCLUDED #define AGG_GLYPH_RASTER_BIN_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_line_aa_basics.h b/deps/agg/include/agg_line_aa_basics.h index c5acb18e7..b8164ce2e 100644 --- a/deps/agg/include/agg_line_aa_basics.h +++ b/deps/agg/include/agg_line_aa_basics.h @@ -15,7 +15,7 @@ #ifndef AGG_LINE_AA_BASICS_INCLUDED #define AGG_LINE_AA_BASICS_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_math.h b/deps/agg/include/agg_math.h index bbb4669b2..2de178bbc 100644 --- a/deps/agg/include/agg_math.h +++ b/deps/agg/include/agg_math.h @@ -19,7 +19,7 @@ #ifndef AGG_MATH_INCLUDED #define AGG_MATH_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_path_storage.h b/deps/agg/include/agg_path_storage.h index 9a2fd8232..74a3a0ac9 100644 --- a/deps/agg/include/agg_path_storage.h +++ b/deps/agg/include/agg_path_storage.h @@ -16,8 +16,8 @@ #ifndef AGG_PATH_STORAGE_INCLUDED #define AGG_PATH_STORAGE_INCLUDED -#include -#include +#include +#include #include "agg_math.h" #include "agg_array.h" #include "agg_bezier_arc.h" diff --git a/deps/agg/include/agg_path_storage_integer.h b/deps/agg/include/agg_path_storage_integer.h index 7c4835599..fff35bb89 100644 --- a/deps/agg/include/agg_path_storage_integer.h +++ b/deps/agg/include/agg_path_storage_integer.h @@ -16,7 +16,7 @@ #ifndef AGG_PATH_STORAGE_INTEGER_INCLUDED #define AGG_PATH_STORAGE_INTEGER_INCLUDED -#include +#include #include "agg_array.h" namespace agg diff --git a/deps/agg/include/agg_pixfmt_amask_adaptor.h b/deps/agg/include/agg_pixfmt_amask_adaptor.h index b30014fc4..1e6f75355 100644 --- a/deps/agg/include/agg_pixfmt_amask_adaptor.h +++ b/deps/agg/include/agg_pixfmt_amask_adaptor.h @@ -17,7 +17,7 @@ #define AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED -#include +#include #include "agg_array.h" #include "agg_rendering_buffer.h" diff --git a/deps/agg/include/agg_pixfmt_gray.h b/deps/agg/include/agg_pixfmt_gray.h index dd4f2469d..3632e2826 100644 --- a/deps/agg/include/agg_pixfmt_gray.h +++ b/deps/agg/include/agg_pixfmt_gray.h @@ -24,7 +24,7 @@ #ifndef AGG_PIXFMT_GRAY_INCLUDED #define AGG_PIXFMT_GRAY_INCLUDED -#include +#include #include "agg_basics.h" #include "agg_color_gray.h" #include "agg_rendering_buffer.h" diff --git a/deps/agg/include/agg_pixfmt_rgb.h b/deps/agg/include/agg_pixfmt_rgb.h index 4025fa5ab..470dd856d 100644 --- a/deps/agg/include/agg_pixfmt_rgb.h +++ b/deps/agg/include/agg_pixfmt_rgb.h @@ -24,7 +24,7 @@ #ifndef AGG_PIXFMT_RGB_INCLUDED #define AGG_PIXFMT_RGB_INCLUDED -#include +#include #include "agg_basics.h" #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" diff --git a/deps/agg/include/agg_pixfmt_rgb_packed.h b/deps/agg/include/agg_pixfmt_rgb_packed.h index 4bb11cf19..82ce9c605 100644 --- a/deps/agg/include/agg_pixfmt_rgb_packed.h +++ b/deps/agg/include/agg_pixfmt_rgb_packed.h @@ -24,7 +24,7 @@ #ifndef AGG_PIXFMT_RGB_PACKED_INCLUDED #define AGG_PIXFMT_RGB_PACKED_INCLUDED -#include +#include #include "agg_basics.h" #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" diff --git a/deps/agg/include/agg_pixfmt_rgba.h b/deps/agg/include/agg_pixfmt_rgba.h index 6fb194091..5ad41f817 100644 --- a/deps/agg/include/agg_pixfmt_rgba.h +++ b/deps/agg/include/agg_pixfmt_rgba.h @@ -25,8 +25,8 @@ #ifndef AGG_PIXFMT_RGBA_INCLUDED #define AGG_PIXFMT_RGBA_INCLUDED -#include -#include +#include +#include #include "agg_basics.h" #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" @@ -134,7 +134,7 @@ namespace agg static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, - unsigned cover=0) + unsigned /*cover*/=0) { calc_type r = p[Order::R]; calc_type g = p[Order::G]; diff --git a/deps/agg/include/agg_rasterizer_cells_aa.h b/deps/agg/include/agg_rasterizer_cells_aa.h index 4e1c62a7d..0997feeca 100755 --- a/deps/agg/include/agg_rasterizer_cells_aa.h +++ b/deps/agg/include/agg_rasterizer_cells_aa.h @@ -29,7 +29,7 @@ #ifndef AGG_RASTERIZER_CELLS_AA_INCLUDED #define AGG_RASTERIZER_CELLS_AA_INCLUDED -#include +#include #include #include #include "agg_math.h" diff --git a/deps/agg/include/agg_scanline_boolean_algebra.h b/deps/agg/include/agg_scanline_boolean_algebra.h index bc2e9c9d5..34eaee913 100644 --- a/deps/agg/include/agg_scanline_boolean_algebra.h +++ b/deps/agg/include/agg_scanline_boolean_algebra.h @@ -16,8 +16,8 @@ #ifndef AGG_SCANLINE_BOOLEAN_ALGEBRA_INCLUDED #define AGG_SCANLINE_BOOLEAN_ALGEBRA_INCLUDED -#include -#include +#include +#include #include "agg_basics.h" diff --git a/deps/agg/include/agg_scanline_storage_aa.h b/deps/agg/include/agg_scanline_storage_aa.h index be452a88f..88e791209 100644 --- a/deps/agg/include/agg_scanline_storage_aa.h +++ b/deps/agg/include/agg_scanline_storage_aa.h @@ -24,9 +24,9 @@ #ifndef AGG_SCANLINE_STORAGE_AA_INCLUDED #define AGG_SCANLINE_STORAGE_AA_INCLUDED -#include -#include -#include +#include +#include +#include #include "agg_array.h" diff --git a/deps/agg/include/agg_scanline_storage_bin.h b/deps/agg/include/agg_scanline_storage_bin.h index d76001697..88589a785 100644 --- a/deps/agg/include/agg_scanline_storage_bin.h +++ b/deps/agg/include/agg_scanline_storage_bin.h @@ -25,9 +25,9 @@ #ifndef AGG_SCANLINE_STORAGE_BIN_INCLUDED #define AGG_SCANLINE_STORAGE_BIN_INCLUDED -#include -#include -#include +#include +#include +#include #include "agg_array.h" diff --git a/deps/agg/include/agg_simul_eq.h b/deps/agg/include/agg_simul_eq.h index 3d0dce4b4..8fc5d2ed2 100644 --- a/deps/agg/include/agg_simul_eq.h +++ b/deps/agg/include/agg_simul_eq.h @@ -19,7 +19,7 @@ #ifndef AGG_SIMUL_EQ_INCLUDED #define AGG_SIMUL_EQ_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_span_gradient.h b/deps/agg/include/agg_span_gradient.h index e30d42b1a..ca8a99fc9 100644 --- a/deps/agg/include/agg_span_gradient.h +++ b/deps/agg/include/agg_span_gradient.h @@ -16,9 +16,9 @@ #ifndef AGG_SPAN_GRADIENT_INCLUDED #define AGG_SPAN_GRADIENT_INCLUDED -#include -#include -#include +#include +#include +#include #include "agg_basics.h" #include "agg_math.h" #include "agg_array.h" diff --git a/deps/agg/include/agg_trans_affine.h b/deps/agg/include/agg_trans_affine.h index 2269b1d9b..a58f0227f 100644 --- a/deps/agg/include/agg_trans_affine.h +++ b/deps/agg/include/agg_trans_affine.h @@ -19,7 +19,7 @@ #ifndef AGG_TRANS_AFFINE_INCLUDED #define AGG_TRANS_AFFINE_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/include/agg_trans_lens.h b/deps/agg/include/agg_trans_lens.h index dfcdaf9a8..f80c090ba 100644 --- a/deps/agg/include/agg_trans_lens.h +++ b/deps/agg/include/agg_trans_lens.h @@ -16,7 +16,7 @@ #ifndef AGG_WARP_MAGNIFIER_INCLUDED #define AGG_WARP_MAGNIFIER_INCLUDED -#include +#include #include "agg_basics.h" diff --git a/deps/agg/include/agg_trans_viewport.h b/deps/agg/include/agg_trans_viewport.h index 7088f9907..d0e0eb25a 100644 --- a/deps/agg/include/agg_trans_viewport.h +++ b/deps/agg/include/agg_trans_viewport.h @@ -21,7 +21,7 @@ #ifndef AGG_TRANS_VIEWPORT_INCLUDED #define AGG_TRANS_VIEWPORT_INCLUDED -#include +#include #include "agg_trans_affine.h" diff --git a/deps/agg/include/agg_vpgen_clip_polygon.h b/deps/agg/include/agg_vpgen_clip_polygon.h index ded754e21..4972a390b 100644 --- a/deps/agg/include/agg_vpgen_clip_polygon.h +++ b/deps/agg/include/agg_vpgen_clip_polygon.h @@ -18,6 +18,9 @@ #include "agg_basics.h" +// https://github.com/mapnik/mapnik/issues/1860 +#include + namespace agg { @@ -25,7 +28,8 @@ namespace agg // // See Implementation agg_vpgen_clip_polygon.cpp // - class vpgen_clip_polygon + + class MAPNIK_DECL vpgen_clip_polygon { public: vpgen_clip_polygon() : diff --git a/deps/agg/include/agg_vpgen_clip_polyline.h b/deps/agg/include/agg_vpgen_clip_polyline.h index b070a7759..a2e60fa7b 100644 --- a/deps/agg/include/agg_vpgen_clip_polyline.h +++ b/deps/agg/include/agg_vpgen_clip_polyline.h @@ -18,6 +18,9 @@ #include "agg_basics.h" +// https://github.com/mapnik/mapnik/issues/1860 +#include + namespace agg { @@ -25,7 +28,7 @@ namespace agg // // See Implementation agg_vpgen_clip_polyline.cpp // - class vpgen_clip_polyline + class MAPNIK_DECL vpgen_clip_polyline { public: vpgen_clip_polyline() : diff --git a/deps/agg/include/agg_vpgen_segmentator.h b/deps/agg/include/agg_vpgen_segmentator.h index 29b3c9fa6..dc98865f7 100644 --- a/deps/agg/include/agg_vpgen_segmentator.h +++ b/deps/agg/include/agg_vpgen_segmentator.h @@ -16,7 +16,7 @@ #ifndef AGG_VPGEN_SEGMENTATOR_INCLUDED #define AGG_VPGEN_SEGMENTATOR_INCLUDED -#include +#include #include "agg_basics.h" namespace agg diff --git a/deps/agg/src/agg_arc.cpp b/deps/agg/src/agg_arc.cpp index df2c43a55..5d9ab6fd9 100644 --- a/deps/agg/src/agg_arc.cpp +++ b/deps/agg/src/agg_arc.cpp @@ -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. // @@ -23,84 +23,84 @@ namespace agg { - //------------------------------------------------------------------------ - arc::arc(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw) : - m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0) +//------------------------------------------------------------------------ +arc::arc(double x, double y, + double rx, double ry, + double a1, double a2, + bool ccw) : + m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0) +{ + normalize(a1, a2, ccw); +} + +//------------------------------------------------------------------------ +void arc::init(double x, double y, + double rx, double ry, + double a1, double a2, + bool ccw) +{ + m_x = x; m_y = y; + m_rx = rx; m_ry = ry; + normalize(a1, a2, ccw); +} + +//------------------------------------------------------------------------ +void arc::approximation_scale(double s) +{ + m_scale = s; + if(m_initialized) { - normalize(a1, a2, ccw); + normalize(m_start, m_end, m_ccw); + } +} + +//------------------------------------------------------------------------ +void arc::rewind(unsigned) +{ + m_path_cmd = path_cmd_move_to; + m_angle = m_start; +} + +//------------------------------------------------------------------------ +unsigned arc::vertex(double* x, double* y) +{ + if(is_stop(m_path_cmd)) return path_cmd_stop; + if((m_angle < m_end - m_da/4) != m_ccw) + { + *x = m_x + cos(m_end) * m_rx; + *y = m_y + sin(m_end) * m_ry; + m_path_cmd = path_cmd_stop; + return path_cmd_line_to; } - //------------------------------------------------------------------------ - void arc::init(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw) + *x = m_x + cos(m_angle) * m_rx; + *y = m_y + sin(m_angle) * m_ry; + + m_angle += m_da; + + unsigned pf = m_path_cmd; + m_path_cmd = path_cmd_line_to; + return pf; +} + +//------------------------------------------------------------------------ +void arc::normalize(double a1, double a2, bool ccw) +{ + double ra = (fabs(m_rx) + fabs(m_ry)) / 2; + m_da = acos(ra / (ra + 0.125 / m_scale)) * 2; + if(ccw) { - m_x = x; m_y = y; - m_rx = rx; m_ry = ry; - normalize(a1, a2, ccw); + while(a2 < a1) a2 += pi * 2.0; } - - //------------------------------------------------------------------------ - void arc::approximation_scale(double s) + else { - m_scale = s; - if(m_initialized) - { - normalize(m_start, m_end, m_ccw); - } - } - - //------------------------------------------------------------------------ - void arc::rewind(unsigned) - { - m_path_cmd = path_cmd_move_to; - m_angle = m_start; - } - - //------------------------------------------------------------------------ - unsigned arc::vertex(double* x, double* y) - { - if(is_stop(m_path_cmd)) return path_cmd_stop; - if((m_angle < m_end - m_da/4) != m_ccw) - { - *x = m_x + cos(m_end) * m_rx; - *y = m_y + sin(m_end) * m_ry; - m_path_cmd = path_cmd_stop; - return path_cmd_line_to; - } - - *x = m_x + cos(m_angle) * m_rx; - *y = m_y + sin(m_angle) * m_ry; - - m_angle += m_da; - - unsigned pf = m_path_cmd; - m_path_cmd = path_cmd_line_to; - return pf; - } - - //------------------------------------------------------------------------ - void arc::normalize(double a1, double a2, bool ccw) - { - double ra = (fabs(m_rx) + fabs(m_ry)) / 2; - m_da = acos(ra / (ra + 0.125 / m_scale)) * 2; - if(ccw) - { - while(a2 < a1) a2 += pi * 2.0; - } - else - { - while(a1 < a2) a1 += pi * 2.0; - m_da = -m_da; - } - m_ccw = ccw; - m_start = a1; - m_end = a2; - m_initialized = true; + while(a1 < a2) a1 += pi * 2.0; + m_da = -m_da; } + m_ccw = ccw; + m_start = a1; + m_end = a2; + m_initialized = true; +} } diff --git a/deps/agg/src/agg_arrowhead.cpp b/deps/agg/src/agg_arrowhead.cpp index 1a6f8b410..bbcfbba71 100644 --- a/deps/agg/src/agg_arrowhead.cpp +++ b/deps/agg/src/agg_arrowhead.cpp @@ -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,7 +13,7 @@ // http://www.antigrain.com //---------------------------------------------------------------------------- // -// Simple arrowhead/arrowtail generator +// Simple arrowhead/arrowtail generator // //---------------------------------------------------------------------------- @@ -22,89 +22,89 @@ namespace agg { - //------------------------------------------------------------------------ - arrowhead::arrowhead() : - m_head_d1(1.0), - m_head_d2(1.0), - m_head_d3(1.0), - m_head_d4(0.0), - m_tail_d1(1.0), - m_tail_d2(1.0), - m_tail_d3(1.0), - m_tail_d4(0.0), - m_head_flag(false), - m_tail_flag(false), - m_curr_id(0), - m_curr_coord(0) +//------------------------------------------------------------------------ +arrowhead::arrowhead() : + m_head_d1(1.0), + m_head_d2(1.0), + m_head_d3(1.0), + m_head_d4(0.0), + m_tail_d1(1.0), + m_tail_d2(1.0), + m_tail_d3(1.0), + m_tail_d4(0.0), + m_head_flag(false), + m_tail_flag(false), + m_curr_id(0), + m_curr_coord(0) +{ +} + + + +//------------------------------------------------------------------------ +void arrowhead::rewind(unsigned path_id) +{ + m_curr_id = path_id; + m_curr_coord = 0; + if(path_id == 0) { - } - - - - //------------------------------------------------------------------------ - void arrowhead::rewind(unsigned path_id) - { - m_curr_id = path_id; - m_curr_coord = 0; - if(path_id == 0) + if(!m_tail_flag) { - if(!m_tail_flag) - { - m_cmd[0] = path_cmd_stop; - return; - } - m_coord[0] = m_tail_d1; m_coord[1] = 0.0; - m_coord[2] = m_tail_d1 - m_tail_d4; m_coord[3] = m_tail_d3; - m_coord[4] = -m_tail_d2 - m_tail_d4; m_coord[5] = m_tail_d3; - m_coord[6] = -m_tail_d2; m_coord[7] = 0.0; - m_coord[8] = -m_tail_d2 - m_tail_d4; m_coord[9] = -m_tail_d3; - m_coord[10] = m_tail_d1 - m_tail_d4; m_coord[11] = -m_tail_d3; - - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_line_to; - m_cmd[5] = path_cmd_line_to; - m_cmd[7] = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_cmd[6] = path_cmd_stop; + m_cmd[0] = path_cmd_stop; return; } + m_coord[0] = m_tail_d1; m_coord[1] = 0.0; + m_coord[2] = m_tail_d1 - m_tail_d4; m_coord[3] = m_tail_d3; + m_coord[4] = -m_tail_d2 - m_tail_d4; m_coord[5] = m_tail_d3; + m_coord[6] = -m_tail_d2; m_coord[7] = 0.0; + m_coord[8] = -m_tail_d2 - m_tail_d4; m_coord[9] = -m_tail_d3; + m_coord[10] = m_tail_d1 - m_tail_d4; m_coord[11] = -m_tail_d3; - if(path_id == 1) + m_cmd[0] = path_cmd_move_to; + m_cmd[1] = path_cmd_line_to; + m_cmd[2] = path_cmd_line_to; + m_cmd[3] = path_cmd_line_to; + m_cmd[4] = path_cmd_line_to; + m_cmd[5] = path_cmd_line_to; + m_cmd[7] = path_cmd_end_poly | path_flags_close | path_flags_ccw; + m_cmd[6] = path_cmd_stop; + return; + } + + if(path_id == 1) + { + if(!m_head_flag) { - if(!m_head_flag) - { - m_cmd[0] = path_cmd_stop; - return; - } - m_coord[0] = -m_head_d1; m_coord[1] = 0.0; - m_coord[2] = m_head_d2 + m_head_d4; m_coord[3] = -m_head_d3; - m_coord[4] = m_head_d2; m_coord[5] = 0.0; - m_coord[6] = m_head_d2 + m_head_d4; m_coord[7] = m_head_d3; - - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_cmd[5] = path_cmd_stop; + m_cmd[0] = path_cmd_stop; return; } + m_coord[0] = -m_head_d1; m_coord[1] = 0.0; + m_coord[2] = m_head_d2 + m_head_d4; m_coord[3] = -m_head_d3; + m_coord[4] = m_head_d2; m_coord[5] = 0.0; + m_coord[6] = m_head_d2 + m_head_d4; m_coord[7] = m_head_d3; + + m_cmd[0] = path_cmd_move_to; + m_cmd[1] = path_cmd_line_to; + m_cmd[2] = path_cmd_line_to; + m_cmd[3] = path_cmd_line_to; + m_cmd[4] = path_cmd_end_poly | path_flags_close | path_flags_ccw; + m_cmd[5] = path_cmd_stop; + return; } +} - //------------------------------------------------------------------------ - unsigned arrowhead::vertex(double* x, double* y) +//------------------------------------------------------------------------ +unsigned arrowhead::vertex(double* x, double* y) +{ + if(m_curr_id < 2) { - if(m_curr_id < 2) - { - unsigned curr_idx = m_curr_coord * 2; - *x = m_coord[curr_idx]; - *y = m_coord[curr_idx + 1]; - return m_cmd[m_curr_coord++]; - } - return path_cmd_stop; + unsigned curr_idx = m_curr_coord * 2; + *x = m_coord[curr_idx]; + *y = m_coord[curr_idx + 1]; + return m_cmd[m_curr_coord++]; } + return path_cmd_stop; +} } diff --git a/deps/agg/src/agg_bezier_arc.cpp b/deps/agg/src/agg_bezier_arc.cpp index 844d300c0..15136aa4a 100644 --- a/deps/agg/src/agg_bezier_arc.cpp +++ b/deps/agg/src/agg_bezier_arc.cpp @@ -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,7 +13,7 @@ // http://www.antigrain.com //---------------------------------------------------------------------------- // -// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e., +// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e., // 4, 7, 10, or 13 vertices. // //---------------------------------------------------------------------------- @@ -26,233 +26,233 @@ namespace agg { - // This epsilon is used to prevent us from adding degenerate curves - // (converging to a single point). - // The value isn't very critical. Function arc_to_bezier() has a limit - // of the sweep_angle. If fabs(sweep_angle) exceeds pi/2 the curve - // becomes inaccurate. But slight exceeding is quite appropriate. - //-------------------------------------------------bezier_arc_angle_epsilon - const double bezier_arc_angle_epsilon = 0.01; +// This epsilon is used to prevent us from adding degenerate curves +// (converging to a single point). +// The value isn't very critical. Function arc_to_bezier() has a limit +// of the sweep_angle. If fabs(sweep_angle) exceeds pi/2 the curve +// becomes inaccurate. But slight exceeding is quite appropriate. +//-------------------------------------------------bezier_arc_angle_epsilon +const double bezier_arc_angle_epsilon = 0.01; - //------------------------------------------------------------arc_to_bezier - void arc_to_bezier(double cx, double cy, double rx, double ry, - double start_angle, double sweep_angle, - double* curve) +//------------------------------------------------------------arc_to_bezier +void arc_to_bezier(double cx, double cy, double rx, double ry, + double start_angle, double sweep_angle, + double* curve) +{ + double x0 = cos(sweep_angle / 2.0); + double y0 = sin(sweep_angle / 2.0); + double tx = (1.0 - x0) * 4.0 / 3.0; + double ty = y0 - tx * x0 / y0; + double px[4]; + double py[4]; + px[0] = x0; + py[0] = -y0; + px[1] = x0 + tx; + py[1] = -ty; + px[2] = x0 + tx; + py[2] = ty; + px[3] = x0; + py[3] = y0; + + double sn = sin(start_angle + sweep_angle / 2.0); + double cs = cos(start_angle + sweep_angle / 2.0); + + unsigned i; + for(i = 0; i < 4; i++) { - double x0 = cos(sweep_angle / 2.0); - double y0 = sin(sweep_angle / 2.0); - double tx = (1.0 - x0) * 4.0 / 3.0; - double ty = y0 - tx * x0 / y0; - double px[4]; - double py[4]; - px[0] = x0; - py[0] = -y0; - px[1] = x0 + tx; - py[1] = -ty; - px[2] = x0 + tx; - py[2] = ty; - px[3] = x0; - py[3] = y0; + curve[i * 2] = cx + rx * (px[i] * cs - py[i] * sn); + curve[i * 2 + 1] = cy + ry * (px[i] * sn + py[i] * cs); + } +} - double sn = sin(start_angle + sweep_angle / 2.0); - double cs = cos(start_angle + sweep_angle / 2.0); - unsigned i; - for(i = 0; i < 4; i++) - { - curve[i * 2] = cx + rx * (px[i] * cs - py[i] * sn); - curve[i * 2 + 1] = cy + ry * (px[i] * sn + py[i] * cs); - } + +//------------------------------------------------------------------------ +void bezier_arc::init(double x, double y, + double rx, double ry, + double start_angle, + double sweep_angle) +{ + start_angle = fmod(start_angle, 2.0 * pi); + if(sweep_angle >= 2.0 * pi) sweep_angle = 2.0 * pi; + if(sweep_angle <= -2.0 * pi) sweep_angle = -2.0 * pi; + + if(fabs(sweep_angle) < 1e-10) + { + m_num_vertices = 4; + m_cmd = path_cmd_line_to; + m_vertices[0] = x + rx * cos(start_angle); + m_vertices[1] = y + ry * sin(start_angle); + m_vertices[2] = x + rx * cos(start_angle + sweep_angle); + m_vertices[3] = y + ry * sin(start_angle + sweep_angle); + return; } - - - //------------------------------------------------------------------------ - void bezier_arc::init(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle) + double total_sweep = 0.0; + double local_sweep = 0.0; + double prev_sweep; + m_num_vertices = 2; + m_cmd = path_cmd_curve4; + bool done = false; + do { - start_angle = fmod(start_angle, 2.0 * pi); - if(sweep_angle >= 2.0 * pi) sweep_angle = 2.0 * pi; - if(sweep_angle <= -2.0 * pi) sweep_angle = -2.0 * pi; - - if(fabs(sweep_angle) < 1e-10) + if(sweep_angle < 0.0) { - m_num_vertices = 4; - m_cmd = path_cmd_line_to; - m_vertices[0] = x + rx * cos(start_angle); - m_vertices[1] = y + ry * sin(start_angle); - m_vertices[2] = x + rx * cos(start_angle + sweep_angle); - m_vertices[3] = y + ry * sin(start_angle + sweep_angle); - return; + prev_sweep = total_sweep; + local_sweep = -pi * 0.5; + total_sweep -= pi * 0.5; + if(total_sweep <= sweep_angle + bezier_arc_angle_epsilon) + { + local_sweep = sweep_angle - prev_sweep; + done = true; + } + } + else + { + prev_sweep = total_sweep; + local_sweep = pi * 0.5; + total_sweep += pi * 0.5; + if(total_sweep >= sweep_angle - bezier_arc_angle_epsilon) + { + local_sweep = sweep_angle - prev_sweep; + done = true; + } } - double total_sweep = 0.0; - double local_sweep = 0.0; - double prev_sweep; - m_num_vertices = 2; - m_cmd = path_cmd_curve4; - bool done = false; - do - { - if(sweep_angle < 0.0) - { - prev_sweep = total_sweep; - local_sweep = -pi * 0.5; - total_sweep -= pi * 0.5; - if(total_sweep <= sweep_angle + bezier_arc_angle_epsilon) - { - local_sweep = sweep_angle - prev_sweep; - done = true; - } - } - else - { - prev_sweep = total_sweep; - local_sweep = pi * 0.5; - total_sweep += pi * 0.5; - if(total_sweep >= sweep_angle - bezier_arc_angle_epsilon) - { - local_sweep = sweep_angle - prev_sweep; - done = true; - } - } + arc_to_bezier(x, y, rx, ry, + start_angle, + local_sweep, + m_vertices + m_num_vertices - 2); - arc_to_bezier(x, y, rx, ry, - start_angle, - local_sweep, - m_vertices + m_num_vertices - 2); + m_num_vertices += 6; + start_angle += local_sweep; + } + while(!done && m_num_vertices < 26); +} - m_num_vertices += 6; - start_angle += local_sweep; - } - while(!done && m_num_vertices < 26); + + + +//-------------------------------------------------------------------- +void bezier_arc_svg::init(double x0, double y0, + double rx, double ry, + double angle, + bool large_arc_flag, + bool sweep_flag, + double x2, double y2) +{ + m_radii_ok = true; + + if(rx < 0.0) rx = -rx; + if(ry < 0.0) ry = -rx; + + // Calculate the middle point between + // the current and the final points + //------------------------ + double dx2 = (x0 - x2) / 2.0; + double dy2 = (y0 - y2) / 2.0; + + double cos_a = cos(angle); + double sin_a = sin(angle); + + // Calculate (x1, y1) + //------------------------ + double x1 = cos_a * dx2 + sin_a * dy2; + double y1 = -sin_a * dx2 + cos_a * dy2; + + // Ensure radii are large enough + //------------------------ + double prx = rx * rx; + double pry = ry * ry; + double px1 = x1 * x1; + double py1 = y1 * y1; + + // Check that radii are large enough + //------------------------ + double radii_check = px1/prx + py1/pry; + if(radii_check > 1.0) + { + rx = sqrt(radii_check) * rx; + ry = sqrt(radii_check) * ry; + prx = rx * rx; + pry = ry * ry; + if(radii_check > 10.0) m_radii_ok = false; } + // Calculate (cx1, cy1) + //------------------------ + double sign = (large_arc_flag == sweep_flag) ? -1.0 : 1.0; + double sq = (prx*pry - prx*py1 - pry*px1) / (prx*py1 + pry*px1); + double coef = sign * sqrt((sq < 0) ? 0 : sq); + double cx1 = coef * ((rx * y1) / ry); + double cy1 = coef * -((ry * x1) / rx); + // + // Calculate (cx, cy) from (cx1, cy1) + //------------------------ + double sx2 = (x0 + x2) / 2.0; + double sy2 = (y0 + y2) / 2.0; + double cx = sx2 + (cos_a * cx1 - sin_a * cy1); + double cy = sy2 + (sin_a * cx1 + cos_a * cy1); + // Calculate the start_angle (angle1) and the sweep_angle (dangle) + //------------------------ + double ux = (x1 - cx1) / rx; + double uy = (y1 - cy1) / ry; + double vx = (-x1 - cx1) / rx; + double vy = (-y1 - cy1) / ry; + double p, n; - //-------------------------------------------------------------------- - void bezier_arc_svg::init(double x0, double y0, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2) + // Calculate the angle start + //------------------------ + n = sqrt(ux*ux + uy*uy); + p = ux; // (1 * ux) + (0 * uy) + sign = (uy < 0) ? -1.0 : 1.0; + double v = p / n; + if(v < -1.0) v = -1.0; + if(v > 1.0) v = 1.0; + double start_angle = sign * acos(v); + + // Calculate the sweep angle + //------------------------ + n = sqrt((ux*ux + uy*uy) * (vx*vx + vy*vy)); + p = ux * vx + uy * vy; + sign = (ux * vy - uy * vx < 0) ? -1.0 : 1.0; + v = p / n; + if(v < -1.0) v = -1.0; + if(v > 1.0) v = 1.0; + double sweep_angle = sign * acos(v); + if(!sweep_flag && sweep_angle > 0) { - m_radii_ok = true; - - if(rx < 0.0) rx = -rx; - if(ry < 0.0) ry = -rx; - - // Calculate the middle point between - // the current and the final points - //------------------------ - double dx2 = (x0 - x2) / 2.0; - double dy2 = (y0 - y2) / 2.0; - - double cos_a = cos(angle); - double sin_a = sin(angle); - - // Calculate (x1, y1) - //------------------------ - double x1 = cos_a * dx2 + sin_a * dy2; - double y1 = -sin_a * dx2 + cos_a * dy2; - - // Ensure radii are large enough - //------------------------ - double prx = rx * rx; - double pry = ry * ry; - double px1 = x1 * x1; - double py1 = y1 * y1; - - // Check that radii are large enough - //------------------------ - double radii_check = px1/prx + py1/pry; - if(radii_check > 1.0) - { - rx = sqrt(radii_check) * rx; - ry = sqrt(radii_check) * ry; - prx = rx * rx; - pry = ry * ry; - if(radii_check > 10.0) m_radii_ok = false; - } - - // Calculate (cx1, cy1) - //------------------------ - double sign = (large_arc_flag == sweep_flag) ? -1.0 : 1.0; - double sq = (prx*pry - prx*py1 - pry*px1) / (prx*py1 + pry*px1); - double coef = sign * sqrt((sq < 0) ? 0 : sq); - double cx1 = coef * ((rx * y1) / ry); - double cy1 = coef * -((ry * x1) / rx); - - // - // Calculate (cx, cy) from (cx1, cy1) - //------------------------ - double sx2 = (x0 + x2) / 2.0; - double sy2 = (y0 + y2) / 2.0; - double cx = sx2 + (cos_a * cx1 - sin_a * cy1); - double cy = sy2 + (sin_a * cx1 + cos_a * cy1); - - // Calculate the start_angle (angle1) and the sweep_angle (dangle) - //------------------------ - double ux = (x1 - cx1) / rx; - double uy = (y1 - cy1) / ry; - double vx = (-x1 - cx1) / rx; - double vy = (-y1 - cy1) / ry; - double p, n; - - // Calculate the angle start - //------------------------ - n = sqrt(ux*ux + uy*uy); - p = ux; // (1 * ux) + (0 * uy) - sign = (uy < 0) ? -1.0 : 1.0; - double v = p / n; - if(v < -1.0) v = -1.0; - if(v > 1.0) v = 1.0; - double start_angle = sign * acos(v); - - // Calculate the sweep angle - //------------------------ - n = sqrt((ux*ux + uy*uy) * (vx*vx + vy*vy)); - p = ux * vx + uy * vy; - sign = (ux * vy - uy * vx < 0) ? -1.0 : 1.0; - v = p / n; - if(v < -1.0) v = -1.0; - if(v > 1.0) v = 1.0; - double sweep_angle = sign * acos(v); - if(!sweep_flag && sweep_angle > 0) - { - sweep_angle -= pi * 2.0; - } - else - if (sweep_flag && sweep_angle < 0) + sweep_angle -= pi * 2.0; + } + else + if (sweep_flag && sweep_angle < 0) { sweep_angle += pi * 2.0; } - // We can now build and transform the resulting arc - //------------------------ - m_arc.init(0.0, 0.0, rx, ry, start_angle, sweep_angle); - trans_affine mtx = trans_affine_rotation(angle); - mtx *= trans_affine_translation(cx, cy); - - for(unsigned i = 2; i < m_arc.num_vertices()-2; i += 2) - { - mtx.transform(m_arc.vertices() + i, m_arc.vertices() + i + 1); - } + // We can now build and transform the resulting arc + //------------------------ + m_arc.init(0.0, 0.0, rx, ry, start_angle, sweep_angle); + trans_affine mtx = trans_affine_rotation(angle); + mtx *= trans_affine_translation(cx, cy); - // We must make sure that the starting and ending points - // exactly coincide with the initial (x0,y0) and (x2,y2) - m_arc.vertices()[0] = x0; - m_arc.vertices()[1] = y0; - if(m_arc.num_vertices() > 2) - { - m_arc.vertices()[m_arc.num_vertices() - 2] = x2; - m_arc.vertices()[m_arc.num_vertices() - 1] = y2; - } + for(unsigned i = 2; i < m_arc.num_vertices()-2; i += 2) + { + mtx.transform(m_arc.vertices() + i, m_arc.vertices() + i + 1); } + // We must make sure that the starting and ending points + // exactly coincide with the initial (x0,y0) and (x2,y2) + m_arc.vertices()[0] = x0; + m_arc.vertices()[1] = y0; + if(m_arc.num_vertices() > 2) + { + m_arc.vertices()[m_arc.num_vertices() - 2] = x2; + m_arc.vertices()[m_arc.num_vertices() - 1] = y2; + } +} + } diff --git a/deps/agg/src/agg_bspline.cpp b/deps/agg/src/agg_bspline.cpp index e1fda9f51..7caa4e521 100644 --- a/deps/agg/src/agg_bspline.cpp +++ b/deps/agg/src/agg_bspline.cpp @@ -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. // @@ -21,242 +21,242 @@ namespace agg { - //------------------------------------------------------------------------ - bspline::bspline() : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - } +//------------------------------------------------------------------------ +bspline::bspline() : + m_max(0), + m_num(0), + m_x(0), + m_y(0), + m_last_idx(-1) +{ +} - //------------------------------------------------------------------------ - bspline::bspline(int num) : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) +//------------------------------------------------------------------------ +bspline::bspline(int num) : + m_max(0), + m_num(0), + m_x(0), + m_y(0), + m_last_idx(-1) +{ + init(num); +} + +//------------------------------------------------------------------------ +bspline::bspline(int num, const double* x, const double* y) : + m_max(0), + m_num(0), + m_x(0), + m_y(0), + m_last_idx(-1) +{ + init(num, x, y); +} + + +//------------------------------------------------------------------------ +void bspline::init(int max) +{ + if(max > 2 && max > m_max) + { + m_am.resize(max * 3); + m_max = max; + m_x = &m_am[m_max]; + m_y = &m_am[m_max * 2]; + } + m_num = 0; + m_last_idx = -1; +} + + +//------------------------------------------------------------------------ +void bspline::add_point(double x, double y) +{ + if(m_num < m_max) + { + m_x[m_num] = x; + m_y[m_num] = y; + ++m_num; + } +} + + +//------------------------------------------------------------------------ +void bspline::prepare() +{ + if(m_num > 2) + { + int i, k, n1; + double* temp; + double* r; + double* s; + double h, p, d, f, e; + + for(k = 0; k < m_num; k++) + { + m_am[k] = 0.0; + } + + n1 = 3 * m_num; + + pod_array al(n1); + temp = &al[0]; + + for(k = 0; k < n1; k++) + { + temp[k] = 0.0; + } + + r = temp + m_num; + s = temp + m_num * 2; + + n1 = m_num - 1; + d = m_x[1] - m_x[0]; + e = (m_y[1] - m_y[0]) / d; + + for(k = 1; k < n1; k++) + { + h = d; + d = m_x[k + 1] - m_x[k]; + f = e; + e = (m_y[k + 1] - m_y[k]) / d; + al[k] = d / (d + h); + r[k] = 1.0 - al[k]; + s[k] = 6.0 * (e - f) / (h + d); + } + + for(k = 1; k < n1; k++) + { + p = 1.0 / (r[k] * al[k - 1] + 2.0); + al[k] *= -p; + s[k] = (s[k] - r[k] * s[k - 1]) * p; + } + + m_am[n1] = 0.0; + al[n1 - 1] = s[n1 - 1]; + m_am[n1 - 1] = al[n1 - 1]; + + for(k = n1 - 2, i = 0; i < m_num - 2; i++, k--) + { + al[k] = al[k] * al[k + 1] + s[k]; + m_am[k] = al[k]; + } + } + m_last_idx = -1; +} + + + +//------------------------------------------------------------------------ +void bspline::init(int num, const double* x, const double* y) +{ + if(num > 2) { init(num); - } - - //------------------------------------------------------------------------ - bspline::bspline(int num, const double* x, const double* y) : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - init(num, x, y); - } - - - //------------------------------------------------------------------------ - void bspline::init(int max) - { - if(max > 2 && max > m_max) + int i; + for(i = 0; i < num; i++) { - m_am.resize(max * 3); - m_max = max; - m_x = &m_am[m_max]; - m_y = &m_am[m_max * 2]; + add_point(*x++, *y++); } - m_num = 0; - m_last_idx = -1; + prepare(); } + m_last_idx = -1; +} - //------------------------------------------------------------------------ - void bspline::add_point(double x, double y) +//------------------------------------------------------------------------ +void bspline::bsearch(int n, const double *x, double x0, int *i) +{ + int j = n - 1; + int k; + + for(*i = 0; (j - *i) > 1; ) { - if(m_num < m_max) + if(x0 < x[k = (*i + j) >> 1]) j = k; + else *i = k; + } +} + + + +//------------------------------------------------------------------------ +double bspline::interpolation(double x, int i) const +{ + int j = i + 1; + double d = m_x[i] - m_x[j]; + double h = x - m_x[j]; + double r = m_x[i] - x; + double p = d * d / 6.0; + return (m_am[j] * r * r * r + m_am[i] * h * h * h) / 6.0 / d + + ((m_y[j] - m_am[j] * p) * r + (m_y[i] - m_am[i] * p) * h) / d; +} + + +//------------------------------------------------------------------------ +double bspline::extrapolation_left(double x) const +{ + double d = m_x[1] - m_x[0]; + return (-d * m_am[1] / 6 + (m_y[1] - m_y[0]) / d) * + (x - m_x[0]) + + m_y[0]; +} + +//------------------------------------------------------------------------ +double bspline::extrapolation_right(double x) const +{ + double d = m_x[m_num - 1] - m_x[m_num - 2]; + return (d * m_am[m_num - 2] / 6 + (m_y[m_num - 1] - m_y[m_num - 2]) / d) * + (x - m_x[m_num - 1]) + + m_y[m_num - 1]; +} + +//------------------------------------------------------------------------ +double bspline::get(double x) const +{ + if(m_num > 2) + { + int i; + + // Extrapolation on the left + if(x < m_x[0]) return extrapolation_left(x); + + // Extrapolation on the right + if(x >= m_x[m_num - 1]) return extrapolation_right(x); + + // Interpolation + bsearch(m_num, m_x, x, &i); + return interpolation(x, i); + } + return 0.0; +} + + +//------------------------------------------------------------------------ +double bspline::get_stateful(double x) const +{ + if(m_num > 2) + { + // Extrapolation on the left + if(x < m_x[0]) return extrapolation_left(x); + + // Extrapolation on the right + if(x >= m_x[m_num - 1]) return extrapolation_right(x); + + if(m_last_idx >= 0) { - m_x[m_num] = x; - m_y[m_num] = y; - ++m_num; - } - } - - - //------------------------------------------------------------------------ - void bspline::prepare() - { - if(m_num > 2) - { - int i, k, n1; - double* temp; - double* r; - double* s; - double h, p, d, f, e; - - for(k = 0; k < m_num; k++) + // Check if x is not in current range + if(x < m_x[m_last_idx] || x > m_x[m_last_idx + 1]) { - m_am[k] = 0.0; - } - - n1 = 3 * m_num; - - pod_array al(n1); - temp = &al[0]; - - for(k = 0; k < n1; k++) - { - temp[k] = 0.0; - } - - r = temp + m_num; - s = temp + m_num * 2; - - n1 = m_num - 1; - d = m_x[1] - m_x[0]; - e = (m_y[1] - m_y[0]) / d; - - for(k = 1; k < n1; k++) - { - h = d; - d = m_x[k + 1] - m_x[k]; - f = e; - e = (m_y[k + 1] - m_y[k]) / d; - al[k] = d / (d + h); - r[k] = 1.0 - al[k]; - s[k] = 6.0 * (e - f) / (h + d); - } - - for(k = 1; k < n1; k++) - { - p = 1.0 / (r[k] * al[k - 1] + 2.0); - al[k] *= -p; - s[k] = (s[k] - r[k] * s[k - 1]) * p; - } - - m_am[n1] = 0.0; - al[n1 - 1] = s[n1 - 1]; - m_am[n1 - 1] = al[n1 - 1]; - - for(k = n1 - 2, i = 0; i < m_num - 2; i++, k--) - { - al[k] = al[k] * al[k + 1] + s[k]; - m_am[k] = al[k]; - } - } - m_last_idx = -1; - } - - - - //------------------------------------------------------------------------ - void bspline::init(int num, const double* x, const double* y) - { - if(num > 2) - { - init(num); - int i; - for(i = 0; i < num; i++) - { - add_point(*x++, *y++); - } - prepare(); - } - m_last_idx = -1; - } - - - //------------------------------------------------------------------------ - void bspline::bsearch(int n, const double *x, double x0, int *i) - { - int j = n - 1; - int k; - - for(*i = 0; (j - *i) > 1; ) - { - if(x0 < x[k = (*i + j) >> 1]) j = k; - else *i = k; - } - } - - - - //------------------------------------------------------------------------ - double bspline::interpolation(double x, int i) const - { - int j = i + 1; - double d = m_x[i] - m_x[j]; - double h = x - m_x[j]; - double r = m_x[i] - x; - double p = d * d / 6.0; - return (m_am[j] * r * r * r + m_am[i] * h * h * h) / 6.0 / d + - ((m_y[j] - m_am[j] * p) * r + (m_y[i] - m_am[i] * p) * h) / d; - } - - - //------------------------------------------------------------------------ - double bspline::extrapolation_left(double x) const - { - double d = m_x[1] - m_x[0]; - return (-d * m_am[1] / 6 + (m_y[1] - m_y[0]) / d) * - (x - m_x[0]) + - m_y[0]; - } - - //------------------------------------------------------------------------ - double bspline::extrapolation_right(double x) const - { - double d = m_x[m_num - 1] - m_x[m_num - 2]; - return (d * m_am[m_num - 2] / 6 + (m_y[m_num - 1] - m_y[m_num - 2]) / d) * - (x - m_x[m_num - 1]) + - m_y[m_num - 1]; - } - - //------------------------------------------------------------------------ - double bspline::get(double x) const - { - if(m_num > 2) - { - int i; - - // Extrapolation on the left - if(x < m_x[0]) return extrapolation_left(x); - - // Extrapolation on the right - if(x >= m_x[m_num - 1]) return extrapolation_right(x); - - // Interpolation - bsearch(m_num, m_x, x, &i); - return interpolation(x, i); - } - return 0.0; - } - - - //------------------------------------------------------------------------ - double bspline::get_stateful(double x) const - { - if(m_num > 2) - { - // Extrapolation on the left - if(x < m_x[0]) return extrapolation_left(x); - - // Extrapolation on the right - if(x >= m_x[m_num - 1]) return extrapolation_right(x); - - if(m_last_idx >= 0) - { - // Check if x is not in current range - if(x < m_x[m_last_idx] || x > m_x[m_last_idx + 1]) + // Check if x between next points (most probably) + if(m_last_idx < m_num - 2 && + x >= m_x[m_last_idx + 1] && + x <= m_x[m_last_idx + 2]) { - // Check if x between next points (most probably) - if(m_last_idx < m_num - 2 && - x >= m_x[m_last_idx + 1] && - x <= m_x[m_last_idx + 2]) - { - ++m_last_idx; - } - else - if(m_last_idx > 0 && - x >= m_x[m_last_idx - 1] && + ++m_last_idx; + } + else + if(m_last_idx > 0 && + x >= m_x[m_last_idx - 1] && x <= m_x[m_last_idx]) { // x is between pevious points @@ -267,18 +267,18 @@ namespace agg // Else perform full search bsearch(m_num, m_x, x, &m_last_idx); } - } - return interpolation(x, m_last_idx); - } - else - { - // Interpolation - bsearch(m_num, m_x, x, &m_last_idx); - return interpolation(x, m_last_idx); } + return interpolation(x, m_last_idx); + } + else + { + // Interpolation + bsearch(m_num, m_x, x, &m_last_idx); + return interpolation(x, m_last_idx); } - return 0.0; } + return 0.0; +} } diff --git a/deps/agg/src/agg_curves.cpp b/deps/agg/src/agg_curves.cpp index 3400aeebd..24aba8256 100644 --- a/deps/agg/src/agg_curves.cpp +++ b/deps/agg/src/agg_curves.cpp @@ -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. // @@ -20,594 +20,594 @@ namespace agg { - //------------------------------------------------------------------------ - const double curve_distance_epsilon = 1e-30; - const double curve_collinearity_epsilon = 1e-30; - const double curve_angle_tolerance_epsilon = 0.01; - enum curve_recursion_limit_e { curve_recursion_limit = 32 }; +//------------------------------------------------------------------------ +const double curve_distance_epsilon = 1e-30; +const double curve_collinearity_epsilon = 1e-30; +const double curve_angle_tolerance_epsilon = 0.01; +enum curve_recursion_limit_e { curve_recursion_limit = 32 }; - //------------------------------------------------------------------------ - void curve3_inc::approximation_scale(double s) - { - m_scale = s; - } +//------------------------------------------------------------------------ +void curve3_inc::approximation_scale(double s) +{ + m_scale = s; +} - //------------------------------------------------------------------------ - double curve3_inc::approximation_scale() const - { - return m_scale; - } +//------------------------------------------------------------------------ +double curve3_inc::approximation_scale() const +{ + return m_scale; +} - //------------------------------------------------------------------------ - void curve3_inc::init(double x1, double y1, - double x2, double y2, - double x3, double y3) +//------------------------------------------------------------------------ +void curve3_inc::init(double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + m_start_x = x1; + m_start_y = y1; + m_end_x = x3; + m_end_y = y3; + + double dx1 = x2 - x1; + double dy1 = y2 - y1; + double dx2 = x3 - x2; + double dy2 = y3 - y2; + + double len = sqrt(dx1 * dx1 + dy1 * dy1) + sqrt(dx2 * dx2 + dy2 * dy2); + + m_num_steps = uround(len * 0.25 * m_scale); + + if(m_num_steps < 4) { - m_start_x = x1; - m_start_y = y1; - m_end_x = x3; - m_end_y = y3; + m_num_steps = 4; + } - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x3 - x2; - double dy2 = y3 - y2; + double subdivide_step = 1.0 / m_num_steps; + double subdivide_step2 = subdivide_step * subdivide_step; - double len = sqrt(dx1 * dx1 + dy1 * dy1) + sqrt(dx2 * dx2 + dy2 * dy2); + double tmpx = (x1 - x2 * 2.0 + x3) * subdivide_step2; + double tmpy = (y1 - y2 * 2.0 + y3) * subdivide_step2; - m_num_steps = uround(len * 0.25 * m_scale); + m_saved_fx = m_fx = x1; + m_saved_fy = m_fy = y1; - if(m_num_steps < 4) + m_saved_dfx = m_dfx = tmpx + (x2 - x1) * (2.0 * subdivide_step); + m_saved_dfy = m_dfy = tmpy + (y2 - y1) * (2.0 * subdivide_step); + + m_ddfx = tmpx * 2.0; + m_ddfy = tmpy * 2.0; + + m_step = m_num_steps; +} + +//------------------------------------------------------------------------ +void curve3_inc::rewind(unsigned) +{ + if(m_num_steps == 0) + { + m_step = -1; + return; + } + m_step = m_num_steps; + m_fx = m_saved_fx; + m_fy = m_saved_fy; + m_dfx = m_saved_dfx; + m_dfy = m_saved_dfy; +} + +//------------------------------------------------------------------------ +unsigned curve3_inc::vertex(double* x, double* y) +{ + if(m_step < 0) return path_cmd_stop; + if(m_step == m_num_steps) + { + *x = m_start_x; + *y = m_start_y; + --m_step; + return path_cmd_move_to; + } + if(m_step == 0) + { + *x = m_end_x; + *y = m_end_y; + --m_step; + return path_cmd_line_to; + } + m_fx += m_dfx; + m_fy += m_dfy; + m_dfx += m_ddfx; + m_dfy += m_ddfy; + *x = m_fx; + *y = m_fy; + --m_step; + return path_cmd_line_to; +} + +//------------------------------------------------------------------------ +void curve3_div::init(double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + m_points.remove_all(); + m_distance_tolerance_square = 0.5 / m_approximation_scale; + m_distance_tolerance_square *= m_distance_tolerance_square; + bezier(x1, y1, x2, y2, x3, y3); + m_count = 0; +} + +//------------------------------------------------------------------------ +void curve3_div::recursive_bezier(double x1, double y1, + double x2, double y2, + double x3, double y3, + unsigned level) +{ + if(level > curve_recursion_limit) + { + return; + } + + // Calculate all the mid-points of the line segments + //---------------------- + double x12 = (x1 + x2) / 2; + double y12 = (y1 + y2) / 2; + double x23 = (x2 + x3) / 2; + double y23 = (y2 + y3) / 2; + double x123 = (x12 + x23) / 2; + double y123 = (y12 + y23) / 2; + + double dx = x3-x1; + double dy = y3-y1; + double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx)); + double da; + + if(d > curve_collinearity_epsilon) + { + // Regular case + //----------------- + if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy)) { - m_num_steps = 4; + // If the curvature doesn't exceed the distance_tolerance value + // we tend to finish subdivisions. + //---------------------- + if(m_angle_tolerance < curve_angle_tolerance_epsilon) + { + m_points.add(point_d(x123, y123)); + return; + } + + // Angle & Cusp Condition + //---------------------- + da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); + if(da >= pi) da = 2*pi - da; + + if(da < m_angle_tolerance) + { + // Finally we can stop the recursion + //---------------------- + m_points.add(point_d(x123, y123)); + return; + } } - - double subdivide_step = 1.0 / m_num_steps; - double subdivide_step2 = subdivide_step * subdivide_step; - - double tmpx = (x1 - x2 * 2.0 + x3) * subdivide_step2; - double tmpy = (y1 - y2 * 2.0 + y3) * subdivide_step2; - - m_saved_fx = m_fx = x1; - m_saved_fy = m_fy = y1; - - m_saved_dfx = m_dfx = tmpx + (x2 - x1) * (2.0 * subdivide_step); - m_saved_dfy = m_dfy = tmpy + (y2 - y1) * (2.0 * subdivide_step); - - m_ddfx = tmpx * 2.0; - m_ddfy = tmpy * 2.0; - - m_step = m_num_steps; } - - //------------------------------------------------------------------------ - void curve3_inc::rewind(unsigned) + else { - if(m_num_steps == 0) + // Collinear case + //------------------ + da = dx*dx + dy*dy; + if(da == 0) { - m_step = -1; + d = calc_sq_distance(x1, y1, x2, y2); + } + else + { + d = ((x2 - x1)*dx + (y2 - y1)*dy) / da; + if(d > 0 && d < 1) + { + // Simple collinear case, 1---2---3 + // We can leave just two endpoints + return; + } + if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1); + else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3); + else d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy); + } + if(d < m_distance_tolerance_square) + { + m_points.add(point_d(x2, y2)); return; } - m_step = m_num_steps; - m_fx = m_saved_fx; - m_fy = m_saved_fy; - m_dfx = m_saved_dfx; - m_dfy = m_saved_dfy; } - //------------------------------------------------------------------------ - unsigned curve3_inc::vertex(double* x, double* y) + // Continue subdivision + //---------------------- + recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); + recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); +} + +//------------------------------------------------------------------------ +void curve3_div::bezier(double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + m_points.add(point_d(x1, y1)); + recursive_bezier(x1, y1, x2, y2, x3, y3, 0); + m_points.add(point_d(x3, y3)); +} + + + + + +//------------------------------------------------------------------------ +void curve4_inc::approximation_scale(double s) +{ + m_scale = s; +} + +//------------------------------------------------------------------------ +double curve4_inc::approximation_scale() const +{ + return m_scale; +} + +#if defined(_MSC_VER) && _MSC_VER <= 1200 +//------------------------------------------------------------------------ +static double MSC60_fix_ICE(double v) { return v; } +#endif + +//------------------------------------------------------------------------ +void curve4_inc::init(double x1, double y1, + double x2, double y2, + double x3, double y3, + double x4, double y4) +{ + m_start_x = x1; + m_start_y = y1; + m_end_x = x4; + m_end_y = y4; + + double dx1 = x2 - x1; + double dy1 = y2 - y1; + double dx2 = x3 - x2; + double dy2 = y3 - y2; + double dx3 = x4 - x3; + double dy3 = y4 - y3; + + double len = (sqrt(dx1 * dx1 + dy1 * dy1) + + sqrt(dx2 * dx2 + dy2 * dy2) + + sqrt(dx3 * dx3 + dy3 * dy3)) * 0.25 * m_scale; + +#if defined(_MSC_VER) && _MSC_VER <= 1200 + m_num_steps = uround(MSC60_fix_ICE(len)); +#else + m_num_steps = uround(len); +#endif + + if(m_num_steps < 4) { - if(m_step < 0) return path_cmd_stop; - if(m_step == m_num_steps) - { - *x = m_start_x; - *y = m_start_y; - --m_step; - return path_cmd_move_to; - } - if(m_step == 0) - { - *x = m_end_x; - *y = m_end_y; - --m_step; - return path_cmd_line_to; - } - m_fx += m_dfx; - m_fy += m_dfy; - m_dfx += m_ddfx; - m_dfy += m_ddfy; - *x = m_fx; - *y = m_fy; + m_num_steps = 4; + } + + double subdivide_step = 1.0 / m_num_steps; + double subdivide_step2 = subdivide_step * subdivide_step; + double subdivide_step3 = subdivide_step * subdivide_step * subdivide_step; + + double pre1 = 3.0 * subdivide_step; + double pre2 = 3.0 * subdivide_step2; + double pre4 = 6.0 * subdivide_step2; + double pre5 = 6.0 * subdivide_step3; + + double tmp1x = x1 - x2 * 2.0 + x3; + double tmp1y = y1 - y2 * 2.0 + y3; + + double tmp2x = (x2 - x3) * 3.0 - x1 + x4; + double tmp2y = (y2 - y3) * 3.0 - y1 + y4; + + m_saved_fx = m_fx = x1; + m_saved_fy = m_fy = y1; + + m_saved_dfx = m_dfx = (x2 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdivide_step3; + m_saved_dfy = m_dfy = (y2 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdivide_step3; + + m_saved_ddfx = m_ddfx = tmp1x * pre4 + tmp2x * pre5; + m_saved_ddfy = m_ddfy = tmp1y * pre4 + tmp2y * pre5; + + m_dddfx = tmp2x * pre5; + m_dddfy = tmp2y * pre5; + + m_step = m_num_steps; +} + +//------------------------------------------------------------------------ +void curve4_inc::rewind(unsigned) +{ + if(m_num_steps == 0) + { + m_step = -1; + return; + } + m_step = m_num_steps; + m_fx = m_saved_fx; + m_fy = m_saved_fy; + m_dfx = m_saved_dfx; + m_dfy = m_saved_dfy; + m_ddfx = m_saved_ddfx; + m_ddfy = m_saved_ddfy; +} + +//------------------------------------------------------------------------ +unsigned curve4_inc::vertex(double* x, double* y) +{ + if(m_step < 0) return path_cmd_stop; + if(m_step == m_num_steps) + { + *x = m_start_x; + *y = m_start_y; + --m_step; + return path_cmd_move_to; + } + + if(m_step == 0) + { + *x = m_end_x; + *y = m_end_y; --m_step; return path_cmd_line_to; } - //------------------------------------------------------------------------ - void curve3_div::init(double x1, double y1, - double x2, double y2, - double x3, double y3) + m_fx += m_dfx; + m_fy += m_dfy; + m_dfx += m_ddfx; + m_dfy += m_ddfy; + m_ddfx += m_dddfx; + m_ddfy += m_dddfy; + + *x = m_fx; + *y = m_fy; + --m_step; + return path_cmd_line_to; +} + + + + +//------------------------------------------------------------------------ +void curve4_div::init(double x1, double y1, + double x2, double y2, + double x3, double y3, + double x4, double y4) +{ + m_points.remove_all(); + m_distance_tolerance_square = 0.5 / m_approximation_scale; + m_distance_tolerance_square *= m_distance_tolerance_square; + bezier(x1, y1, x2, y2, x3, y3, x4, y4); + m_count = 0; +} + +//------------------------------------------------------------------------ +void curve4_div::recursive_bezier(double x1, double y1, + double x2, double y2, + double x3, double y3, + double x4, double y4, + unsigned level) +{ + if(level > curve_recursion_limit) { - m_points.remove_all(); - m_distance_tolerance_square = 0.5 / m_approximation_scale; - m_distance_tolerance_square *= m_distance_tolerance_square; - bezier(x1, y1, x2, y2, x3, y3); - m_count = 0; + return; } - //------------------------------------------------------------------------ - void curve3_div::recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - unsigned level) + // Calculate all the mid-points of the line segments + //---------------------- + double x12 = (x1 + x2) / 2; + double y12 = (y1 + y2) / 2; + double x23 = (x2 + x3) / 2; + double y23 = (y2 + y3) / 2; + double x34 = (x3 + x4) / 2; + double y34 = (y3 + y4) / 2; + double x123 = (x12 + x23) / 2; + double y123 = (y12 + y23) / 2; + double x234 = (x23 + x34) / 2; + double y234 = (y23 + y34) / 2; + double x1234 = (x123 + x234) / 2; + double y1234 = (y123 + y234) / 2; + + + // Try to approximate the full cubic curve by a single straight line + //------------------ + double dx = x4-x1; + double dy = y4-y1; + + double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx)); + double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx)); + double da1, da2, k; + + switch((int(d2 > curve_collinearity_epsilon) << 1) + + int(d3 > curve_collinearity_epsilon)) { - if(level > curve_recursion_limit) - { - return; - } - - // Calculate all the mid-points of the line segments + case 0: + // All collinear OR p1==p4 //---------------------- - double x12 = (x1 + x2) / 2; - double y12 = (y1 + y2) / 2; - double x23 = (x2 + x3) / 2; - double y23 = (y2 + y3) / 2; - double x123 = (x12 + x23) / 2; - double y123 = (y12 + y23) / 2; - - double dx = x3-x1; - double dy = y3-y1; - double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx)); - double da; - - if(d > curve_collinearity_epsilon) - { - // Regular case - //----------------- - if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - // If the curvature doesn't exceed the distance_tolerance value - // we tend to finish subdivisions. - //---------------------- - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x123, y123)); - return; - } - - // Angle & Cusp Condition - //---------------------- - da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); - if(da >= pi) da = 2*pi - da; - - if(da < m_angle_tolerance) - { - // Finally we can stop the recursion - //---------------------- - m_points.add(point_d(x123, y123)); - return; - } - } + k = dx*dx + dy*dy; + if(k == 0) + { + d2 = calc_sq_distance(x1, y1, x2, y2); + d3 = calc_sq_distance(x4, y4, x3, y3); } else { - // Collinear case - //------------------ - da = dx*dx + dy*dy; - if(da == 0) + k = 1 / k; + da1 = x2 - x1; + da2 = y2 - y1; + d2 = k * (da1*dx + da2*dy); + da1 = x3 - x1; + da2 = y3 - y1; + d3 = k * (da1*dx + da2*dy); + if(d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) { - d = calc_sq_distance(x1, y1, x2, y2); + // Simple collinear case, 1---2---3---4 + // We can leave just two endpoints + return; } - else - { - d = ((x2 - x1)*dx + (y2 - y1)*dy) / da; - if(d > 0 && d < 1) - { - // Simple collinear case, 1---2---3 - // We can leave just two endpoints - return; - } - if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1); - else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3); - else d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy); - } - if(d < m_distance_tolerance_square) + if(d2 <= 0) d2 = calc_sq_distance(x2, y2, x1, y1); + else if(d2 >= 1) d2 = calc_sq_distance(x2, y2, x4, y4); + else d2 = calc_sq_distance(x2, y2, x1 + d2*dx, y1 + d2*dy); + + if(d3 <= 0) d3 = calc_sq_distance(x3, y3, x1, y1); + else if(d3 >= 1) d3 = calc_sq_distance(x3, y3, x4, y4); + else d3 = calc_sq_distance(x3, y3, x1 + d3*dx, y1 + d3*dy); + } + if(d2 > d3) + { + if(d2 < m_distance_tolerance_square) { m_points.add(point_d(x2, y2)); return; } } + else + { + if(d3 < m_distance_tolerance_square) + { + m_points.add(point_d(x3, y3)); + return; + } + } + break; - // Continue subdivision + case 1: + // p1,p2,p4 are collinear, p3 is significant //---------------------- - recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); - recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); - } - - //------------------------------------------------------------------------ - void curve3_div::bezier(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_points.add(point_d(x1, y1)); - recursive_bezier(x1, y1, x2, y2, x3, y3, 0); - m_points.add(point_d(x3, y3)); - } - - - - - - //------------------------------------------------------------------------ - void curve4_inc::approximation_scale(double s) - { - m_scale = s; - } - - //------------------------------------------------------------------------ - double curve4_inc::approximation_scale() const - { - return m_scale; - } - -#if defined(_MSC_VER) && _MSC_VER <= 1200 - //------------------------------------------------------------------------ - static double MSC60_fix_ICE(double v) { return v; } -#endif - - //------------------------------------------------------------------------ - void curve4_inc::init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_start_x = x1; - m_start_y = y1; - m_end_x = x4; - m_end_y = y4; - - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x3 - x2; - double dy2 = y3 - y2; - double dx3 = x4 - x3; - double dy3 = y4 - y3; - - double len = (sqrt(dx1 * dx1 + dy1 * dy1) + - sqrt(dx2 * dx2 + dy2 * dy2) + - sqrt(dx3 * dx3 + dy3 * dy3)) * 0.25 * m_scale; - -#if defined(_MSC_VER) && _MSC_VER <= 1200 - m_num_steps = uround(MSC60_fix_ICE(len)); -#else - m_num_steps = uround(len); -#endif - - if(m_num_steps < 4) + if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy)) { - m_num_steps = 4; - } + if(m_angle_tolerance < curve_angle_tolerance_epsilon) + { + m_points.add(point_d(x23, y23)); + return; + } - double subdivide_step = 1.0 / m_num_steps; - double subdivide_step2 = subdivide_step * subdivide_step; - double subdivide_step3 = subdivide_step * subdivide_step * subdivide_step; - - double pre1 = 3.0 * subdivide_step; - double pre2 = 3.0 * subdivide_step2; - double pre4 = 6.0 * subdivide_step2; - double pre5 = 6.0 * subdivide_step3; - - double tmp1x = x1 - x2 * 2.0 + x3; - double tmp1y = y1 - y2 * 2.0 + y3; - - double tmp2x = (x2 - x3) * 3.0 - x1 + x4; - double tmp2y = (y2 - y3) * 3.0 - y1 + y4; - - m_saved_fx = m_fx = x1; - m_saved_fy = m_fy = y1; - - m_saved_dfx = m_dfx = (x2 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdivide_step3; - m_saved_dfy = m_dfy = (y2 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdivide_step3; - - m_saved_ddfx = m_ddfx = tmp1x * pre4 + tmp2x * pre5; - m_saved_ddfy = m_ddfy = tmp1y * pre4 + tmp2y * pre5; - - m_dddfx = tmp2x * pre5; - m_dddfy = tmp2y * pre5; - - m_step = m_num_steps; - } - - //------------------------------------------------------------------------ - void curve4_inc::rewind(unsigned) - { - if(m_num_steps == 0) - { - m_step = -1; - return; - } - m_step = m_num_steps; - m_fx = m_saved_fx; - m_fy = m_saved_fy; - m_dfx = m_saved_dfx; - m_dfy = m_saved_dfy; - m_ddfx = m_saved_ddfx; - m_ddfy = m_saved_ddfy; - } - - //------------------------------------------------------------------------ - unsigned curve4_inc::vertex(double* x, double* y) - { - if(m_step < 0) return path_cmd_stop; - if(m_step == m_num_steps) - { - *x = m_start_x; - *y = m_start_y; - --m_step; - return path_cmd_move_to; - } - - if(m_step == 0) - { - *x = m_end_x; - *y = m_end_y; - --m_step; - return path_cmd_line_to; - } - - m_fx += m_dfx; - m_fy += m_dfy; - m_dfx += m_ddfx; - m_dfy += m_ddfy; - m_ddfx += m_dddfx; - m_ddfy += m_dddfy; - - *x = m_fx; - *y = m_fy; - --m_step; - return path_cmd_line_to; - } - - - - - //------------------------------------------------------------------------ - void curve4_div::init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_points.remove_all(); - m_distance_tolerance_square = 0.5 / m_approximation_scale; - m_distance_tolerance_square *= m_distance_tolerance_square; - bezier(x1, y1, x2, y2, x3, y3, x4, y4); - m_count = 0; - } - - //------------------------------------------------------------------------ - void curve4_div::recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4, - unsigned level) - { - if(level > curve_recursion_limit) - { - return; - } - - // Calculate all the mid-points of the line segments - //---------------------- - double x12 = (x1 + x2) / 2; - double y12 = (y1 + y2) / 2; - double x23 = (x2 + x3) / 2; - double y23 = (y2 + y3) / 2; - double x34 = (x3 + x4) / 2; - double y34 = (y3 + y4) / 2; - double x123 = (x12 + x23) / 2; - double y123 = (y12 + y23) / 2; - double x234 = (x23 + x34) / 2; - double y234 = (y23 + y34) / 2; - double x1234 = (x123 + x234) / 2; - double y1234 = (y123 + y234) / 2; - - - // Try to approximate the full cubic curve by a single straight line - //------------------ - double dx = x4-x1; - double dy = y4-y1; - - double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx)); - double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx)); - double da1, da2, k; - - switch((int(d2 > curve_collinearity_epsilon) << 1) + - int(d3 > curve_collinearity_epsilon)) - { - case 0: - // All collinear OR p1==p4 + // Angle Condition //---------------------- - k = dx*dx + dy*dy; - if(k == 0) - { - d2 = calc_sq_distance(x1, y1, x2, y2); - d3 = calc_sq_distance(x4, y4, x3, y3); - } - else - { - k = 1 / k; - da1 = x2 - x1; - da2 = y2 - y1; - d2 = k * (da1*dx + da2*dy); - da1 = x3 - x1; - da2 = y3 - y1; - d3 = k * (da1*dx + da2*dy); - if(d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) - { - // Simple collinear case, 1---2---3---4 - // We can leave just two endpoints - return; - } - if(d2 <= 0) d2 = calc_sq_distance(x2, y2, x1, y1); - else if(d2 >= 1) d2 = calc_sq_distance(x2, y2, x4, y4); - else d2 = calc_sq_distance(x2, y2, x1 + d2*dx, y1 + d2*dy); + da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2)); + if(da1 >= pi) da1 = 2*pi - da1; - if(d3 <= 0) d3 = calc_sq_distance(x3, y3, x1, y1); - else if(d3 >= 1) d3 = calc_sq_distance(x3, y3, x4, y4); - else d3 = calc_sq_distance(x3, y3, x1 + d3*dx, y1 + d3*dy); - } - if(d2 > d3) + if(da1 < m_angle_tolerance) { - if(d2 < m_distance_tolerance_square) - { - m_points.add(point_d(x2, y2)); - return; - } + m_points.add(point_d(x2, y2)); + m_points.add(point_d(x3, y3)); + return; } - else + + if(m_cusp_limit != 0.0) { - if(d3 < m_distance_tolerance_square) + if(da1 > m_cusp_limit) { m_points.add(point_d(x3, y3)); return; } } - break; - - case 1: - // p1,p2,p4 are collinear, p3 is significant - //---------------------- - if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle Condition - //---------------------- - da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2)); - if(da1 >= pi) da1 = 2*pi - da1; - - if(da1 < m_angle_tolerance) - { - m_points.add(point_d(x2, y2)); - m_points.add(point_d(x3, y3)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x3, y3)); - return; - } - } - } - break; - - case 2: - // p1,p3,p4 are collinear, p2 is significant - //---------------------- - if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle Condition - //---------------------- - da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); - if(da1 >= pi) da1 = 2*pi - da1; - - if(da1 < m_angle_tolerance) - { - m_points.add(point_d(x2, y2)); - m_points.add(point_d(x3, y3)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x2, y2)); - return; - } - } - } - break; - - case 3: - // Regular case - //----------------- - if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - // If the curvature doesn't exceed the distance_tolerance value - // we tend to finish subdivisions. - //---------------------- - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle & Cusp Condition - //---------------------- - k = atan2(y3 - y2, x3 - x2); - da1 = fabs(k - atan2(y2 - y1, x2 - x1)); - da2 = fabs(atan2(y4 - y3, x4 - x3) - k); - if(da1 >= pi) da1 = 2*pi - da1; - if(da2 >= pi) da2 = 2*pi - da2; - - if(da1 + da2 < m_angle_tolerance) - { - // Finally we can stop the recursion - //---------------------- - m_points.add(point_d(x23, y23)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x2, y2)); - return; - } - - if(da2 > m_cusp_limit) - { - m_points.add(point_d(x3, y3)); - return; - } - } - } - break; } + break; - // Continue subdivision + case 2: + // p1,p3,p4 are collinear, p2 is significant //---------------------- - recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); - recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); + if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy)) + { + if(m_angle_tolerance < curve_angle_tolerance_epsilon) + { + m_points.add(point_d(x23, y23)); + return; + } + + // Angle Condition + //---------------------- + da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); + if(da1 >= pi) da1 = 2*pi - da1; + + if(da1 < m_angle_tolerance) + { + m_points.add(point_d(x2, y2)); + m_points.add(point_d(x3, y3)); + return; + } + + if(m_cusp_limit != 0.0) + { + if(da1 > m_cusp_limit) + { + m_points.add(point_d(x2, y2)); + return; + } + } + } + break; + + case 3: + // Regular case + //----------------- + if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy)) + { + // If the curvature doesn't exceed the distance_tolerance value + // we tend to finish subdivisions. + //---------------------- + if(m_angle_tolerance < curve_angle_tolerance_epsilon) + { + m_points.add(point_d(x23, y23)); + return; + } + + // Angle & Cusp Condition + //---------------------- + k = atan2(y3 - y2, x3 - x2); + da1 = fabs(k - atan2(y2 - y1, x2 - x1)); + da2 = fabs(atan2(y4 - y3, x4 - x3) - k); + if(da1 >= pi) da1 = 2*pi - da1; + if(da2 >= pi) da2 = 2*pi - da2; + + if(da1 + da2 < m_angle_tolerance) + { + // Finally we can stop the recursion + //---------------------- + m_points.add(point_d(x23, y23)); + return; + } + + if(m_cusp_limit != 0.0) + { + if(da1 > m_cusp_limit) + { + m_points.add(point_d(x2, y2)); + return; + } + + if(da2 > m_cusp_limit) + { + m_points.add(point_d(x3, y3)); + return; + } + } + } + break; } - //------------------------------------------------------------------------ - void curve4_div::bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_points.add(point_d(x1, y1)); - recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); - m_points.add(point_d(x4, y4)); - } + // Continue subdivision + //---------------------- + recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); + recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); +} + +//------------------------------------------------------------------------ +void curve4_div::bezier(double x1, double y1, + double x2, double y2, + double x3, double y3, + double x4, double y4) +{ + m_points.add(point_d(x1, y1)); + recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); + m_points.add(point_d(x4, y4)); +} } diff --git a/deps/agg/src/agg_embedded_raster_fonts.cpp b/deps/agg/src/agg_embedded_raster_fonts.cpp index ee4dc65ee..525d0d550 100644 --- a/deps/agg/src/agg_embedded_raster_fonts.cpp +++ b/deps/agg/src/agg_embedded_raster_fonts.cpp @@ -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,10409 +18,10409 @@ namespace agg { - const int8u gse4x6[] = - { - 6, 0, 32, 128-32, +const int8u gse4x6[] = +{ + 6, 0, 32, 128-32, - 0x00,0x00,0x07,0x00,0x0e,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x2a,0x00,0x31,0x00,0x38,0x00, - 0x3f,0x00,0x46,0x00,0x4d,0x00,0x54,0x00,0x5b,0x00,0x62,0x00,0x69,0x00,0x70,0x00,0x77,0x00, - 0x7e,0x00,0x85,0x00,0x8c,0x00,0x93,0x00,0x9a,0x00,0xa1,0x00,0xa8,0x00,0xaf,0x00,0xb6,0x00, - 0xbd,0x00,0xc4,0x00,0xcb,0x00,0xd2,0x00,0xd9,0x00,0xe0,0x00,0xe7,0x00,0xee,0x00,0xf5,0x00, - 0xfc,0x00,0x03,0x01,0x0a,0x01,0x11,0x01,0x18,0x01,0x1f,0x01,0x26,0x01,0x2d,0x01,0x34,0x01, - 0x3b,0x01,0x42,0x01,0x49,0x01,0x50,0x01,0x57,0x01,0x5e,0x01,0x65,0x01,0x6c,0x01,0x73,0x01, - 0x7a,0x01,0x81,0x01,0x88,0x01,0x8f,0x01,0x96,0x01,0x9d,0x01,0xa4,0x01,0xab,0x01,0xb2,0x01, - 0xb9,0x01,0xc0,0x01,0xc7,0x01,0xce,0x01,0xd5,0x01,0xdc,0x01,0xe3,0x01,0xea,0x01,0xf1,0x01, - 0xf8,0x01,0xff,0x01,0x06,0x02,0x0d,0x02,0x14,0x02,0x1b,0x02,0x22,0x02,0x29,0x02,0x30,0x02, - 0x37,0x02,0x3e,0x02,0x45,0x02,0x4c,0x02,0x53,0x02,0x5a,0x02,0x61,0x02,0x68,0x02,0x6f,0x02, - 0x76,0x02,0x7d,0x02,0x84,0x02,0x8b,0x02,0x92,0x02,0x99,0x02, + 0x00,0x00,0x07,0x00,0x0e,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x2a,0x00,0x31,0x00,0x38,0x00, + 0x3f,0x00,0x46,0x00,0x4d,0x00,0x54,0x00,0x5b,0x00,0x62,0x00,0x69,0x00,0x70,0x00,0x77,0x00, + 0x7e,0x00,0x85,0x00,0x8c,0x00,0x93,0x00,0x9a,0x00,0xa1,0x00,0xa8,0x00,0xaf,0x00,0xb6,0x00, + 0xbd,0x00,0xc4,0x00,0xcb,0x00,0xd2,0x00,0xd9,0x00,0xe0,0x00,0xe7,0x00,0xee,0x00,0xf5,0x00, + 0xfc,0x00,0x03,0x01,0x0a,0x01,0x11,0x01,0x18,0x01,0x1f,0x01,0x26,0x01,0x2d,0x01,0x34,0x01, + 0x3b,0x01,0x42,0x01,0x49,0x01,0x50,0x01,0x57,0x01,0x5e,0x01,0x65,0x01,0x6c,0x01,0x73,0x01, + 0x7a,0x01,0x81,0x01,0x88,0x01,0x8f,0x01,0x96,0x01,0x9d,0x01,0xa4,0x01,0xab,0x01,0xb2,0x01, + 0xb9,0x01,0xc0,0x01,0xc7,0x01,0xce,0x01,0xd5,0x01,0xdc,0x01,0xe3,0x01,0xea,0x01,0xf1,0x01, + 0xf8,0x01,0xff,0x01,0x06,0x02,0x0d,0x02,0x14,0x02,0x1b,0x02,0x22,0x02,0x29,0x02,0x30,0x02, + 0x37,0x02,0x3e,0x02,0x45,0x02,0x4c,0x02,0x53,0x02,0x5a,0x02,0x61,0x02,0x68,0x02,0x6f,0x02, + 0x76,0x02,0x7d,0x02,0x84,0x02,0x8b,0x02,0x92,0x02,0x99,0x02, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x40,0x40,0x40,0x00,0x40,0x00, + 4, // 0x21 '!' + 0x40,0x40,0x40,0x00,0x40,0x00, - 4, // 0x22 '"' - 0xa0,0xa0,0x00,0x00,0x00,0x00, + 4, // 0x22 '"' + 0xa0,0xa0,0x00,0x00,0x00,0x00, - 4, // 0x23 '#' - 0x60,0xf0,0x60,0xf0,0x60,0x00, + 4, // 0x23 '#' + 0x60,0xf0,0x60,0xf0,0x60,0x00, - 4, // 0x24 '$' - 0x40,0x60,0xc0,0x60,0xc0,0x40, + 4, // 0x24 '$' + 0x40,0x60,0xc0,0x60,0xc0,0x40, - 4, // 0x25 '%' - 0xa0,0x20,0x40,0x80,0xa0,0x00, + 4, // 0x25 '%' + 0xa0,0x20,0x40,0x80,0xa0,0x00, - 4, // 0x26 '&' - 0xe0,0xa0,0x50,0xa0,0xd0,0x00, + 4, // 0x26 '&' + 0xe0,0xa0,0x50,0xa0,0xd0,0x00, - 4, // 0x27 ''' - 0x40,0x40,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x40,0x40,0x00,0x00,0x00,0x00, - 4, // 0x28 '(' - 0x20,0x40,0x40,0x40,0x20,0x00, + 4, // 0x28 '(' + 0x20,0x40,0x40,0x40,0x20,0x00, - 4, // 0x29 ')' - 0x40,0x20,0x20,0x20,0x40,0x00, + 4, // 0x29 ')' + 0x40,0x20,0x20,0x20,0x40,0x00, - 4, // 0x2a '*' - 0xa0,0x40,0xe0,0x40,0xa0,0x00, + 4, // 0x2a '*' + 0xa0,0x40,0xe0,0x40,0xa0,0x00, - 4, // 0x2b '+' - 0x40,0x40,0xe0,0x40,0x40,0x00, + 4, // 0x2b '+' + 0x40,0x40,0xe0,0x40,0x40,0x00, - 4, // 0x2c ',' - 0x00,0x00,0x00,0x40,0x40,0x80, + 4, // 0x2c ',' + 0x00,0x00,0x00,0x40,0x40,0x80, - 4, // 0x2d '-' - 0x00,0x00,0xe0,0x00,0x00,0x00, + 4, // 0x2d '-' + 0x00,0x00,0xe0,0x00,0x00,0x00, - 4, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x40,0x00, + 4, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x40,0x00, - 4, // 0x2f '/' - 0x10,0x20,0x20,0x40,0x40,0x80, + 4, // 0x2f '/' + 0x10,0x20,0x20,0x40,0x40,0x80, - 4, // 0x30 '0' - 0xe0,0xa0,0xa0,0xa0,0xe0,0x00, + 4, // 0x30 '0' + 0xe0,0xa0,0xa0,0xa0,0xe0,0x00, - 4, // 0x31 '1' - 0x40,0xc0,0x40,0x40,0xe0,0x00, + 4, // 0x31 '1' + 0x40,0xc0,0x40,0x40,0xe0,0x00, - 4, // 0x32 '2' - 0xe0,0xa0,0x20,0x40,0xe0,0x00, + 4, // 0x32 '2' + 0xe0,0xa0,0x20,0x40,0xe0,0x00, - 4, // 0x33 '3' - 0xe0,0x20,0x40,0x20,0xe0,0x00, + 4, // 0x33 '3' + 0xe0,0x20,0x40,0x20,0xe0,0x00, - 4, // 0x34 '4' - 0xa0,0xa0,0xe0,0x20,0x20,0x00, + 4, // 0x34 '4' + 0xa0,0xa0,0xe0,0x20,0x20,0x00, - 4, // 0x35 '5' - 0xe0,0x80,0xc0,0x20,0xc0,0x00, + 4, // 0x35 '5' + 0xe0,0x80,0xc0,0x20,0xc0,0x00, - 4, // 0x36 '6' - 0x40,0x80,0xe0,0xa0,0xe0,0x00, + 4, // 0x36 '6' + 0x40,0x80,0xe0,0xa0,0xe0,0x00, - 4, // 0x37 '7' - 0xe0,0xa0,0x20,0x40,0x40,0x00, + 4, // 0x37 '7' + 0xe0,0xa0,0x20,0x40,0x40,0x00, - 4, // 0x38 '8' - 0xe0,0xa0,0x40,0xa0,0xe0,0x00, + 4, // 0x38 '8' + 0xe0,0xa0,0x40,0xa0,0xe0,0x00, - 4, // 0x39 '9' - 0xe0,0xa0,0xe0,0x20,0xc0,0x00, + 4, // 0x39 '9' + 0xe0,0xa0,0xe0,0x20,0xc0,0x00, - 4, // 0x3a ':' - 0x00,0x40,0x00,0x40,0x00,0x00, + 4, // 0x3a ':' + 0x00,0x40,0x00,0x40,0x00,0x00, - 4, // 0x3b ';' - 0x00,0x40,0x00,0x40,0x40,0x80, + 4, // 0x3b ';' + 0x00,0x40,0x00,0x40,0x40,0x80, - 4, // 0x3c '<' - 0x20,0x40,0x80,0x40,0x20,0x00, + 4, // 0x3c '<' + 0x20,0x40,0x80,0x40,0x20,0x00, - 4, // 0x3d '=' - 0x00,0xe0,0x00,0xe0,0x00,0x00, + 4, // 0x3d '=' + 0x00,0xe0,0x00,0xe0,0x00,0x00, - 4, // 0x3e '>' - 0x80,0x40,0x20,0x40,0x80,0x00, + 4, // 0x3e '>' + 0x80,0x40,0x20,0x40,0x80,0x00, - 4, // 0x3f '?' - 0xc0,0x20,0x40,0x00,0x40,0x00, + 4, // 0x3f '?' + 0xc0,0x20,0x40,0x00,0x40,0x00, - 4, // 0x40 '@' - 0x40,0xa0,0xe0,0xe0,0x80,0x60, + 4, // 0x40 '@' + 0x40,0xa0,0xe0,0xe0,0x80,0x60, - 4, // 0x41 'A' - 0x40,0xa0,0xe0,0xa0,0xa0,0x00, + 4, // 0x41 'A' + 0x40,0xa0,0xe0,0xa0,0xa0,0x00, - 4, // 0x42 'B' - 0xc0,0xa0,0xc0,0xa0,0xc0,0x00, + 4, // 0x42 'B' + 0xc0,0xa0,0xc0,0xa0,0xc0,0x00, - 4, // 0x43 'C' - 0x60,0x80,0x80,0x80,0x60,0x00, + 4, // 0x43 'C' + 0x60,0x80,0x80,0x80,0x60,0x00, - 4, // 0x44 'D' - 0xc0,0xa0,0xa0,0xa0,0xc0,0x00, + 4, // 0x44 'D' + 0xc0,0xa0,0xa0,0xa0,0xc0,0x00, - 4, // 0x45 'E' - 0xe0,0x80,0xc0,0x80,0xe0,0x00, + 4, // 0x45 'E' + 0xe0,0x80,0xc0,0x80,0xe0,0x00, - 4, // 0x46 'F' - 0xe0,0x80,0xc0,0x80,0x80,0x00, + 4, // 0x46 'F' + 0xe0,0x80,0xc0,0x80,0x80,0x00, - 4, // 0x47 'G' - 0x60,0x80,0xa0,0xa0,0x40,0x00, + 4, // 0x47 'G' + 0x60,0x80,0xa0,0xa0,0x40,0x00, - 4, // 0x48 'H' - 0xa0,0xa0,0xe0,0xa0,0xa0,0x00, + 4, // 0x48 'H' + 0xa0,0xa0,0xe0,0xa0,0xa0,0x00, - 4, // 0x49 'I' - 0xe0,0x40,0x40,0x40,0xe0,0x00, + 4, // 0x49 'I' + 0xe0,0x40,0x40,0x40,0xe0,0x00, - 4, // 0x4a 'J' - 0x20,0x20,0x20,0x20,0xa0,0x40, + 4, // 0x4a 'J' + 0x20,0x20,0x20,0x20,0xa0,0x40, - 4, // 0x4b 'K' - 0xa0,0xa0,0xc0,0xc0,0xa0,0x00, + 4, // 0x4b 'K' + 0xa0,0xa0,0xc0,0xc0,0xa0,0x00, - 4, // 0x4c 'L' - 0x80,0x80,0x80,0x80,0xe0,0x00, + 4, // 0x4c 'L' + 0x80,0x80,0x80,0x80,0xe0,0x00, - 4, // 0x4d 'M' - 0xa0,0xe0,0xa0,0xa0,0xa0,0x00, + 4, // 0x4d 'M' + 0xa0,0xe0,0xa0,0xa0,0xa0,0x00, - 4, // 0x4e 'N' - 0x90,0xd0,0xb0,0x90,0x90,0x00, + 4, // 0x4e 'N' + 0x90,0xd0,0xb0,0x90,0x90,0x00, - 4, // 0x4f 'O' - 0x40,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x4f 'O' + 0x40,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x50 'P' - 0xc0,0xa0,0xa0,0xc0,0x80,0x00, + 4, // 0x50 'P' + 0xc0,0xa0,0xa0,0xc0,0x80,0x00, - 4, // 0x51 'Q' - 0x40,0xa0,0xa0,0xa0,0x60,0x00, + 4, // 0x51 'Q' + 0x40,0xa0,0xa0,0xa0,0x60,0x00, - 4, // 0x52 'R' - 0xc0,0xa0,0xa0,0xc0,0xa0,0x00, + 4, // 0x52 'R' + 0xc0,0xa0,0xa0,0xc0,0xa0,0x00, - 4, // 0x53 'S' - 0x60,0x80,0x40,0x20,0xc0,0x00, + 4, // 0x53 'S' + 0x60,0x80,0x40,0x20,0xc0,0x00, - 4, // 0x54 'T' - 0xe0,0x40,0x40,0x40,0x40,0x00, + 4, // 0x54 'T' + 0xe0,0x40,0x40,0x40,0x40,0x00, - 4, // 0x55 'U' - 0xa0,0xa0,0xa0,0xa0,0xe0,0x00, + 4, // 0x55 'U' + 0xa0,0xa0,0xa0,0xa0,0xe0,0x00, - 4, // 0x56 'V' - 0xa0,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x56 'V' + 0xa0,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x57 'W' - 0xa0,0xa0,0xa0,0xe0,0xa0,0x00, + 4, // 0x57 'W' + 0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - 4, // 0x58 'X' - 0xa0,0xa0,0x40,0xa0,0xa0,0x00, + 4, // 0x58 'X' + 0xa0,0xa0,0x40,0xa0,0xa0,0x00, - 4, // 0x59 'Y' - 0xa0,0xa0,0x40,0x40,0x40,0x00, + 4, // 0x59 'Y' + 0xa0,0xa0,0x40,0x40,0x40,0x00, - 4, // 0x5a 'Z' - 0xe0,0x20,0x40,0x80,0xe0,0x00, + 4, // 0x5a 'Z' + 0xe0,0x20,0x40,0x80,0xe0,0x00, - 4, // 0x5b '[' - 0xc0,0x80,0x80,0x80,0xc0,0x00, + 4, // 0x5b '[' + 0xc0,0x80,0x80,0x80,0xc0,0x00, - 4, // 0x5c '\' - 0x80,0x40,0x40,0x20,0x20,0x10, + 4, // 0x5c '\' + 0x80,0x40,0x40,0x20,0x20,0x10, - 4, // 0x5d ']' - 0xc0,0x40,0x40,0x40,0xc0,0x00, + 4, // 0x5d ']' + 0xc0,0x40,0x40,0x40,0xc0,0x00, - 4, // 0x5e '^' - 0x40,0xa0,0x00,0x00,0x00,0x00, + 4, // 0x5e '^' + 0x40,0xa0,0x00,0x00,0x00,0x00, - 4, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0xf0, + 4, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0xf0, - 4, // 0x60 '`' - 0x40,0x20,0x00,0x00,0x00,0x00, + 4, // 0x60 '`' + 0x40,0x20,0x00,0x00,0x00,0x00, - 4, // 0x61 'a' - 0x00,0x60,0xa0,0xa0,0x70,0x00, + 4, // 0x61 'a' + 0x00,0x60,0xa0,0xa0,0x70,0x00, - 4, // 0x62 'b' - 0x80,0x80,0xc0,0xa0,0xc0,0x00, + 4, // 0x62 'b' + 0x80,0x80,0xc0,0xa0,0xc0,0x00, - 4, // 0x63 'c' - 0x00,0x60,0x80,0x80,0x60,0x00, + 4, // 0x63 'c' + 0x00,0x60,0x80,0x80,0x60,0x00, - 4, // 0x64 'd' - 0x20,0x20,0x60,0xa0,0x60,0x00, + 4, // 0x64 'd' + 0x20,0x20,0x60,0xa0,0x60,0x00, - 4, // 0x65 'e' - 0x00,0x40,0xe0,0x80,0x60,0x00, + 4, // 0x65 'e' + 0x00,0x40,0xe0,0x80,0x60,0x00, - 4, // 0x66 'f' - 0x20,0x40,0xe0,0x40,0x40,0x00, + 4, // 0x66 'f' + 0x20,0x40,0xe0,0x40,0x40,0x00, - 4, // 0x67 'g' - 0x00,0x60,0xa0,0x60,0x20,0xc0, + 4, // 0x67 'g' + 0x00,0x60,0xa0,0x60,0x20,0xc0, - 4, // 0x68 'h' - 0x80,0x80,0xc0,0xa0,0xa0,0x00, + 4, // 0x68 'h' + 0x80,0x80,0xc0,0xa0,0xa0,0x00, - 4, // 0x69 'i' - 0x40,0x00,0xc0,0x40,0xe0,0x00, + 4, // 0x69 'i' + 0x40,0x00,0xc0,0x40,0xe0,0x00, - 4, // 0x6a 'j' - 0x40,0x00,0xc0,0x40,0x40,0x80, + 4, // 0x6a 'j' + 0x40,0x00,0xc0,0x40,0x40,0x80, - 4, // 0x6b 'k' - 0x80,0x80,0xa0,0xc0,0xa0,0x00, + 4, // 0x6b 'k' + 0x80,0x80,0xa0,0xc0,0xa0,0x00, - 4, // 0x6c 'l' - 0xc0,0x40,0x40,0x40,0xe0,0x00, + 4, // 0x6c 'l' + 0xc0,0x40,0x40,0x40,0xe0,0x00, - 4, // 0x6d 'm' - 0x00,0xa0,0xf0,0xf0,0x90,0x00, + 4, // 0x6d 'm' + 0x00,0xa0,0xf0,0xf0,0x90,0x00, - 4, // 0x6e 'n' - 0x00,0xc0,0xa0,0xa0,0xa0,0x00, + 4, // 0x6e 'n' + 0x00,0xc0,0xa0,0xa0,0xa0,0x00, - 4, // 0x6f 'o' - 0x00,0x40,0xa0,0xa0,0x40,0x00, + 4, // 0x6f 'o' + 0x00,0x40,0xa0,0xa0,0x40,0x00, - 4, // 0x70 'p' - 0x00,0xc0,0xa0,0xc0,0x80,0x80, + 4, // 0x70 'p' + 0x00,0xc0,0xa0,0xc0,0x80,0x80, - 4, // 0x71 'q' - 0x00,0x60,0xa0,0x60,0x20,0x20, + 4, // 0x71 'q' + 0x00,0x60,0xa0,0x60,0x20,0x20, - 4, // 0x72 'r' - 0x00,0xa0,0x50,0x40,0x40,0x00, + 4, // 0x72 'r' + 0x00,0xa0,0x50,0x40,0x40,0x00, - 4, // 0x73 's' - 0x00,0x60,0xc0,0x20,0xc0,0x00, + 4, // 0x73 's' + 0x00,0x60,0xc0,0x20,0xc0,0x00, - 4, // 0x74 't' - 0x40,0x40,0xe0,0x40,0x60,0x00, + 4, // 0x74 't' + 0x40,0x40,0xe0,0x40,0x60,0x00, - 4, // 0x75 'u' - 0x00,0xa0,0xa0,0xa0,0x60,0x00, + 4, // 0x75 'u' + 0x00,0xa0,0xa0,0xa0,0x60,0x00, - 4, // 0x76 'v' - 0x00,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x76 'v' + 0x00,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x77 'w' - 0x00,0xa0,0xa0,0xe0,0xa0,0x00, + 4, // 0x77 'w' + 0x00,0xa0,0xa0,0xe0,0xa0,0x00, - 4, // 0x78 'x' - 0x00,0xa0,0x40,0xa0,0xa0,0x00, + 4, // 0x78 'x' + 0x00,0xa0,0x40,0xa0,0xa0,0x00, - 4, // 0x79 'y' - 0x00,0xa0,0xa0,0x60,0x20,0xc0, + 4, // 0x79 'y' + 0x00,0xa0,0xa0,0x60,0x20,0xc0, - 4, // 0x7a 'z' - 0x00,0xe0,0x40,0x80,0xe0,0x00, + 4, // 0x7a 'z' + 0x00,0xe0,0x40,0x80,0xe0,0x00, - 4, // 0x7b '{' - 0x30,0x20,0xc0,0x20,0x30,0x00, + 4, // 0x7b '{' + 0x30,0x20,0xc0,0x20,0x30,0x00, - 4, // 0x7c '|' - 0x40,0x40,0x00,0x40,0x40,0x40, + 4, // 0x7c '|' + 0x40,0x40,0x00,0x40,0x40,0x40, - 4, // 0x7d '}' - 0xc0,0x40,0x30,0x40,0xc0,0x00, + 4, // 0x7d '}' + 0xc0,0x40,0x30,0x40,0xc0,0x00, - 4, // 0x7e '~' - 0x50,0xa0,0x00,0x00,0x00,0x00, + 4, // 0x7e '~' + 0x50,0xa0,0x00,0x00,0x00,0x00, - 4, // 0x7f '' - 0x00,0x60,0x90,0xf0,0x00,0x00, - 0 - }; + 4, // 0x7f '' + 0x00,0x60,0x90,0xf0,0x00,0x00, + 0 +}; - const int8u gse4x8[] = - { - 8, 0, 32, 128-32, +const int8u gse4x8[] = +{ + 8, 0, 32, 128-32, - 0x00,0x00,0x09,0x00,0x12,0x00,0x1b,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x48,0x00, - 0x51,0x00,0x5a,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x7e,0x00,0x87,0x00,0x90,0x00,0x99,0x00, - 0xa2,0x00,0xab,0x00,0xb4,0x00,0xbd,0x00,0xc6,0x00,0xcf,0x00,0xd8,0x00,0xe1,0x00,0xea,0x00, - 0xf3,0x00,0xfc,0x00,0x05,0x01,0x0e,0x01,0x17,0x01,0x20,0x01,0x29,0x01,0x32,0x01,0x3b,0x01, - 0x44,0x01,0x4d,0x01,0x56,0x01,0x5f,0x01,0x68,0x01,0x71,0x01,0x7a,0x01,0x83,0x01,0x8c,0x01, - 0x95,0x01,0x9e,0x01,0xa7,0x01,0xb0,0x01,0xb9,0x01,0xc2,0x01,0xcb,0x01,0xd4,0x01,0xdd,0x01, - 0xe6,0x01,0xef,0x01,0xf8,0x01,0x01,0x02,0x0a,0x02,0x13,0x02,0x1c,0x02,0x25,0x02,0x2e,0x02, - 0x37,0x02,0x40,0x02,0x49,0x02,0x52,0x02,0x5b,0x02,0x64,0x02,0x6d,0x02,0x76,0x02,0x7f,0x02, - 0x88,0x02,0x91,0x02,0x9a,0x02,0xa3,0x02,0xac,0x02,0xb5,0x02,0xbe,0x02,0xc7,0x02,0xd0,0x02, - 0xd9,0x02,0xe2,0x02,0xeb,0x02,0xf4,0x02,0xfd,0x02,0x06,0x03,0x0f,0x03,0x18,0x03,0x21,0x03, - 0x2a,0x03,0x33,0x03,0x3c,0x03,0x45,0x03,0x4e,0x03,0x57,0x03, + 0x00,0x00,0x09,0x00,0x12,0x00,0x1b,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x48,0x00, + 0x51,0x00,0x5a,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x7e,0x00,0x87,0x00,0x90,0x00,0x99,0x00, + 0xa2,0x00,0xab,0x00,0xb4,0x00,0xbd,0x00,0xc6,0x00,0xcf,0x00,0xd8,0x00,0xe1,0x00,0xea,0x00, + 0xf3,0x00,0xfc,0x00,0x05,0x01,0x0e,0x01,0x17,0x01,0x20,0x01,0x29,0x01,0x32,0x01,0x3b,0x01, + 0x44,0x01,0x4d,0x01,0x56,0x01,0x5f,0x01,0x68,0x01,0x71,0x01,0x7a,0x01,0x83,0x01,0x8c,0x01, + 0x95,0x01,0x9e,0x01,0xa7,0x01,0xb0,0x01,0xb9,0x01,0xc2,0x01,0xcb,0x01,0xd4,0x01,0xdd,0x01, + 0xe6,0x01,0xef,0x01,0xf8,0x01,0x01,0x02,0x0a,0x02,0x13,0x02,0x1c,0x02,0x25,0x02,0x2e,0x02, + 0x37,0x02,0x40,0x02,0x49,0x02,0x52,0x02,0x5b,0x02,0x64,0x02,0x6d,0x02,0x76,0x02,0x7f,0x02, + 0x88,0x02,0x91,0x02,0x9a,0x02,0xa3,0x02,0xac,0x02,0xb5,0x02,0xbe,0x02,0xc7,0x02,0xd0,0x02, + 0xd9,0x02,0xe2,0x02,0xeb,0x02,0xf4,0x02,0xfd,0x02,0x06,0x03,0x0f,0x03,0x18,0x03,0x21,0x03, + 0x2a,0x03,0x33,0x03,0x3c,0x03,0x45,0x03,0x4e,0x03,0x57,0x03, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x00, + 4, // 0x21 '!' + 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x00, - 4, // 0x22 '"' - 0x00,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, + 4, // 0x22 '"' + 0x00,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, - 4, // 0x23 '#' - 0x60,0x60,0xf0,0x60,0x60,0xf0,0x60,0x60, + 4, // 0x23 '#' + 0x60,0x60,0xf0,0x60,0x60,0xf0,0x60,0x60, - 4, // 0x24 '$' - 0x40,0x60,0xc0,0xc0,0x60,0x60,0xc0,0x40, + 4, // 0x24 '$' + 0x40,0x60,0xc0,0xc0,0x60,0x60,0xc0,0x40, - 4, // 0x25 '%' - 0x00,0xa0,0x20,0x40,0x40,0x80,0xa0,0x00, + 4, // 0x25 '%' + 0x00,0xa0,0x20,0x40,0x40,0x80,0xa0,0x00, - 4, // 0x26 '&' - 0x00,0x40,0xa0,0xa0,0x40,0xb0,0xa0,0x70, + 4, // 0x26 '&' + 0x00,0x40,0xa0,0xa0,0x40,0xb0,0xa0,0x70, - 4, // 0x27 ''' - 0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00, - 4, // 0x28 '(' - 0x20,0x40,0x80,0x80,0x80,0x80,0x40,0x20, + 4, // 0x28 '(' + 0x20,0x40,0x80,0x80,0x80,0x80,0x40,0x20, - 4, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x20,0x40,0x80, + 4, // 0x29 ')' + 0x80,0x40,0x20,0x20,0x20,0x20,0x40,0x80, - 4, // 0x2a '*' - 0x00,0xa0,0x40,0xe0,0x40,0xa0,0x00,0x00, + 4, // 0x2a '*' + 0x00,0xa0,0x40,0xe0,0x40,0xa0,0x00,0x00, - 4, // 0x2b '+' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x00,0x00, + 4, // 0x2b '+' + 0x00,0x40,0x40,0xe0,0x40,0x40,0x00,0x00, - 4, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, + 4, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, - 4, // 0x2d '-' - 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, + 4, // 0x2d '-' + 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, - 4, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, + 4, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - 4, // 0x2f '/' - 0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, + 4, // 0x2f '/' + 0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, - 4, // 0x30 '0' - 0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00, + 4, // 0x30 '0' + 0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00, - 4, // 0x31 '1' - 0x00,0x40,0xc0,0x40,0x40,0x40,0xe0,0x00, + 4, // 0x31 '1' + 0x00,0x40,0xc0,0x40,0x40,0x40,0xe0,0x00, - 4, // 0x32 '2' - 0x00,0xe0,0xa0,0x20,0x40,0x80,0xe0,0x00, + 4, // 0x32 '2' + 0x00,0xe0,0xa0,0x20,0x40,0x80,0xe0,0x00, - 4, // 0x33 '3' - 0x00,0xe0,0x20,0x40,0x20,0x20,0xe0,0x00, + 4, // 0x33 '3' + 0x00,0xe0,0x20,0x40,0x20,0x20,0xe0,0x00, - 4, // 0x34 '4' - 0x00,0x60,0xa0,0xa0,0xf0,0x20,0x20,0x00, + 4, // 0x34 '4' + 0x00,0x60,0xa0,0xa0,0xf0,0x20,0x20,0x00, - 4, // 0x35 '5' - 0x00,0xe0,0x80,0xc0,0x20,0x20,0xc0,0x00, + 4, // 0x35 '5' + 0x00,0xe0,0x80,0xc0,0x20,0x20,0xc0,0x00, - 4, // 0x36 '6' - 0x00,0x40,0x80,0xe0,0xa0,0xa0,0xe0,0x00, + 4, // 0x36 '6' + 0x00,0x40,0x80,0xe0,0xa0,0xa0,0xe0,0x00, - 4, // 0x37 '7' - 0x00,0xe0,0xa0,0x20,0x40,0x40,0x40,0x00, + 4, // 0x37 '7' + 0x00,0xe0,0xa0,0x20,0x40,0x40,0x40,0x00, - 4, // 0x38 '8' - 0x00,0xe0,0xa0,0x40,0xa0,0xa0,0xe0,0x00, + 4, // 0x38 '8' + 0x00,0xe0,0xa0,0x40,0xa0,0xa0,0xe0,0x00, - 4, // 0x39 '9' - 0x00,0xe0,0xa0,0xe0,0x20,0x20,0x40,0x00, + 4, // 0x39 '9' + 0x00,0xe0,0xa0,0xe0,0x20,0x20,0x40,0x00, - 4, // 0x3a ':' - 0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00, + 4, // 0x3a ':' + 0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00, - 4, // 0x3b ';' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x80, + 4, // 0x3b ';' + 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x80, - 4, // 0x3c '<' - 0x00,0x20,0x40,0x80,0x40,0x20,0x00,0x00, + 4, // 0x3c '<' + 0x00,0x20,0x40,0x80,0x40,0x20,0x00,0x00, - 4, // 0x3d '=' - 0x00,0x00,0xe0,0x00,0xe0,0x00,0x00,0x00, + 4, // 0x3d '=' + 0x00,0x00,0xe0,0x00,0xe0,0x00,0x00,0x00, - 4, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x40,0x80,0x00,0x00, + 4, // 0x3e '>' + 0x00,0x80,0x40,0x20,0x40,0x80,0x00,0x00, - 4, // 0x3f '?' - 0x00,0x40,0xa0,0x20,0x40,0x00,0x40,0x00, + 4, // 0x3f '?' + 0x00,0x40,0xa0,0x20,0x40,0x00,0x40,0x00, - 4, // 0x40 '@' - 0x00,0x40,0xa0,0xe0,0xe0,0x80,0x60,0x00, + 4, // 0x40 '@' + 0x00,0x40,0xa0,0xe0,0xe0,0x80,0x60,0x00, - 4, // 0x41 'A' - 0x00,0x40,0xa0,0xa0,0xe0,0xa0,0xa0,0x00, + 4, // 0x41 'A' + 0x00,0x40,0xa0,0xa0,0xe0,0xa0,0xa0,0x00, - 4, // 0x42 'B' - 0x00,0xc0,0xa0,0xc0,0xa0,0xa0,0xc0,0x00, + 4, // 0x42 'B' + 0x00,0xc0,0xa0,0xc0,0xa0,0xa0,0xc0,0x00, - 4, // 0x43 'C' - 0x00,0x40,0xa0,0x80,0x80,0xa0,0x40,0x00, + 4, // 0x43 'C' + 0x00,0x40,0xa0,0x80,0x80,0xa0,0x40,0x00, - 4, // 0x44 'D' - 0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0xc0,0x00, + 4, // 0x44 'D' + 0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0xc0,0x00, - 4, // 0x45 'E' - 0x00,0xe0,0x80,0xc0,0x80,0x80,0xe0,0x00, + 4, // 0x45 'E' + 0x00,0xe0,0x80,0xc0,0x80,0x80,0xe0,0x00, - 4, // 0x46 'F' - 0x00,0xe0,0x80,0xc0,0x80,0x80,0x80,0x00, + 4, // 0x46 'F' + 0x00,0xe0,0x80,0xc0,0x80,0x80,0x80,0x00, - 4, // 0x47 'G' - 0x00,0x60,0x80,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x47 'G' + 0x00,0x60,0x80,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x48 'H' - 0x00,0xa0,0xa0,0xe0,0xa0,0xa0,0xa0,0x00, + 4, // 0x48 'H' + 0x00,0xa0,0xa0,0xe0,0xa0,0xa0,0xa0,0x00, - 4, // 0x49 'I' - 0x00,0xe0,0x40,0x40,0x40,0x40,0xe0,0x00, + 4, // 0x49 'I' + 0x00,0xe0,0x40,0x40,0x40,0x40,0xe0,0x00, - 4, // 0x4a 'J' - 0x00,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, + 4, // 0x4a 'J' + 0x00,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, - 4, // 0x4b 'K' - 0x00,0xa0,0xa0,0xc0,0xc0,0xa0,0xa0,0x00, + 4, // 0x4b 'K' + 0x00,0xa0,0xa0,0xc0,0xc0,0xa0,0xa0,0x00, - 4, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0xe0,0x00, + 4, // 0x4c 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0xe0,0x00, - 4, // 0x4d 'M' - 0x00,0xa0,0xe0,0xa0,0xa0,0xa0,0xa0,0x00, + 4, // 0x4d 'M' + 0x00,0xa0,0xe0,0xa0,0xa0,0xa0,0xa0,0x00, - 4, // 0x4e 'N' - 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x00, + 4, // 0x4e 'N' + 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x00, - 4, // 0x4f 'O' - 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x4f 'O' + 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x50 'P' - 0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80,0x00, + 4, // 0x50 'P' + 0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80,0x00, - 4, // 0x51 'Q' - 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x60,0x00, + 4, // 0x51 'Q' + 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x60,0x00, - 4, // 0x52 'R' - 0x00,0xc0,0xa0,0xa0,0xc0,0xc0,0xa0,0x00, + 4, // 0x52 'R' + 0x00,0xc0,0xa0,0xa0,0xc0,0xc0,0xa0,0x00, - 4, // 0x53 'S' - 0x00,0x60,0x80,0x40,0x20,0x20,0xc0,0x00, + 4, // 0x53 'S' + 0x00,0x60,0x80,0x40,0x20,0x20,0xc0,0x00, - 4, // 0x54 'T' - 0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0x00, + 4, // 0x54 'T' + 0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0x00, - 4, // 0x55 'U' - 0x00,0xa0,0xa0,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x55 'U' + 0x00,0xa0,0xa0,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x56 'V' - 0x00,0xa0,0xa0,0xa0,0xa0,0x40,0x40,0x00, + 4, // 0x56 'V' + 0x00,0xa0,0xa0,0xa0,0xa0,0x40,0x40,0x00, - 4, // 0x57 'W' - 0x00,0xa0,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, + 4, // 0x57 'W' + 0x00,0xa0,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - 4, // 0x58 'X' - 0x00,0xa0,0xa0,0x40,0xa0,0xa0,0xa0,0x00, + 4, // 0x58 'X' + 0x00,0xa0,0xa0,0x40,0xa0,0xa0,0xa0,0x00, - 4, // 0x59 'Y' - 0x00,0xa0,0xa0,0x40,0x40,0x40,0x40,0x00, + 4, // 0x59 'Y' + 0x00,0xa0,0xa0,0x40,0x40,0x40,0x40,0x00, - 4, // 0x5a 'Z' - 0x00,0xe0,0x20,0x40,0x40,0x80,0xe0,0x00, + 4, // 0x5a 'Z' + 0x00,0xe0,0x20,0x40,0x40,0x80,0xe0,0x00, - 4, // 0x5b '[' - 0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0xc0, + 4, // 0x5b '[' + 0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0xc0, - 4, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10, + 4, // 0x5c '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10, - 4, // 0x5d ']' - 0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0xc0, + 4, // 0x5d ']' + 0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0xc0, - 4, // 0x5e '^' - 0x00,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, + 4, // 0x5e '^' + 0x00,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, - 4, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 4, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, - 4, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00, + 4, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00, - 4, // 0x61 'a' - 0x00,0x00,0x60,0xa0,0xa0,0xa0,0x70,0x00, + 4, // 0x61 'a' + 0x00,0x00,0x60,0xa0,0xa0,0xa0,0x70,0x00, - 4, // 0x62 'b' - 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xc0,0x00, + 4, // 0x62 'b' + 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xc0,0x00, - 4, // 0x63 'c' - 0x00,0x00,0x40,0xa0,0x80,0xa0,0x40,0x00, + 4, // 0x63 'c' + 0x00,0x00,0x40,0xa0,0x80,0xa0,0x40,0x00, - 4, // 0x64 'd' - 0x00,0x20,0x20,0x60,0xa0,0xa0,0x60,0x00, + 4, // 0x64 'd' + 0x00,0x20,0x20,0x60,0xa0,0xa0,0x60,0x00, - 4, // 0x65 'e' - 0x00,0x00,0x40,0xa0,0xe0,0x80,0x60,0x00, + 4, // 0x65 'e' + 0x00,0x00,0x40,0xa0,0xe0,0x80,0x60,0x00, - 4, // 0x66 'f' - 0x00,0x20,0x40,0x40,0xe0,0x40,0x40,0x00, + 4, // 0x66 'f' + 0x00,0x20,0x40,0x40,0xe0,0x40,0x40,0x00, - 4, // 0x67 'g' - 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0xc0, + 4, // 0x67 'g' + 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0xc0, - 4, // 0x68 'h' - 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xa0,0x00, + 4, // 0x68 'h' + 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xa0,0x00, - 4, // 0x69 'i' - 0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x00, + 4, // 0x69 'i' + 0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x00, - 4, // 0x6a 'j' - 0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0x80, + 4, // 0x6a 'j' + 0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0x80, - 4, // 0x6b 'k' - 0x00,0x80,0x80,0xa0,0xc0,0xc0,0xa0,0x00, + 4, // 0x6b 'k' + 0x00,0x80,0x80,0xa0,0xc0,0xc0,0xa0,0x00, - 4, // 0x6c 'l' - 0x00,0xc0,0x40,0x40,0x40,0x40,0xe0,0x00, + 4, // 0x6c 'l' + 0x00,0xc0,0x40,0x40,0x40,0x40,0xe0,0x00, - 4, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x00, + 4, // 0x6d 'm' + 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x00, - 4, // 0x6e 'n' - 0x00,0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0x00, + 4, // 0x6e 'n' + 0x00,0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0x00, - 4, // 0x6f 'o' - 0x00,0x00,0x40,0xa0,0xa0,0xa0,0x40,0x00, + 4, // 0x6f 'o' + 0x00,0x00,0x40,0xa0,0xa0,0xa0,0x40,0x00, - 4, // 0x70 'p' - 0x00,0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80, + 4, // 0x70 'p' + 0x00,0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80, - 4, // 0x71 'q' - 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0x20, + 4, // 0x71 'q' + 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0x20, - 4, // 0x72 'r' - 0x00,0x00,0xa0,0x50,0x40,0x40,0x40,0x00, + 4, // 0x72 'r' + 0x00,0x00,0xa0,0x50,0x40,0x40,0x40,0x00, - 4, // 0x73 's' - 0x00,0x00,0x60,0x80,0x40,0x20,0xc0,0x00, + 4, // 0x73 's' + 0x00,0x00,0x60,0x80,0x40,0x20,0xc0,0x00, - 4, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x20,0x00, + 4, // 0x74 't' + 0x00,0x40,0x40,0xe0,0x40,0x40,0x20,0x00, - 4, // 0x75 'u' - 0x00,0x00,0xa0,0xa0,0xa0,0xa0,0x60,0x00, + 4, // 0x75 'u' + 0x00,0x00,0xa0,0xa0,0xa0,0xa0,0x60,0x00, - 4, // 0x76 'v' - 0x00,0x00,0xa0,0xa0,0xa0,0x40,0x40,0x00, + 4, // 0x76 'v' + 0x00,0x00,0xa0,0xa0,0xa0,0x40,0x40,0x00, - 4, // 0x77 'w' - 0x00,0x00,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, + 4, // 0x77 'w' + 0x00,0x00,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - 4, // 0x78 'x' - 0x00,0x00,0xa0,0xa0,0x40,0xa0,0xa0,0x00, + 4, // 0x78 'x' + 0x00,0x00,0xa0,0xa0,0x40,0xa0,0xa0,0x00, - 4, // 0x79 'y' - 0x00,0x00,0xa0,0xa0,0xa0,0x60,0x20,0xc0, + 4, // 0x79 'y' + 0x00,0x00,0xa0,0xa0,0xa0,0x60,0x20,0xc0, - 4, // 0x7a 'z' - 0x00,0x00,0xe0,0x20,0x40,0x80,0xe0,0x00, + 4, // 0x7a 'z' + 0x00,0x00,0xe0,0x20,0x40,0x80,0xe0,0x00, - 4, // 0x7b '{' - 0x10,0x20,0x20,0xc0,0x20,0x20,0x10,0x00, + 4, // 0x7b '{' + 0x10,0x20,0x20,0xc0,0x20,0x20,0x10,0x00, - 4, // 0x7c '|' - 0x00,0x40,0x40,0x40,0x00,0x40,0x40,0x40, + 4, // 0x7c '|' + 0x00,0x40,0x40,0x40,0x00,0x40,0x40,0x40, - 4, // 0x7d '}' - 0x80,0x40,0x40,0x30,0x40,0x40,0x80,0x00, + 4, // 0x7d '}' + 0x80,0x40,0x40,0x30,0x40,0x40,0x80,0x00, - 4, // 0x7e '~' - 0x00,0x50,0xa0,0x00,0x00,0x00,0x00,0x00, + 4, // 0x7e '~' + 0x00,0x50,0xa0,0x00,0x00,0x00,0x00,0x00, - 4, // 0x7f '' - 0x00,0x00,0x00,0x60,0x90,0xf0,0x00,0x00, - 0 - }; + 4, // 0x7f '' + 0x00,0x00,0x00,0x60,0x90,0xf0,0x00,0x00, + 0 +}; - const int8u gse5x7[] = - { - 7, 0, 32, 128-32, +const int8u gse5x7[] = +{ + 7, 0, 32, 128-32, - 0x00,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x38,0x00,0x40,0x00, - 0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00, - 0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00, - 0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x00,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01, - 0x20,0x01,0x28,0x01,0x30,0x01,0x38,0x01,0x40,0x01,0x48,0x01,0x50,0x01,0x58,0x01,0x60,0x01, - 0x68,0x01,0x70,0x01,0x78,0x01,0x80,0x01,0x88,0x01,0x90,0x01,0x98,0x01,0xa0,0x01,0xa8,0x01, - 0xb0,0x01,0xb8,0x01,0xc0,0x01,0xc8,0x01,0xd0,0x01,0xd8,0x01,0xe0,0x01,0xe8,0x01,0xf0,0x01, - 0xf8,0x01,0x00,0x02,0x08,0x02,0x10,0x02,0x18,0x02,0x20,0x02,0x28,0x02,0x30,0x02,0x38,0x02, - 0x40,0x02,0x48,0x02,0x50,0x02,0x58,0x02,0x60,0x02,0x68,0x02,0x70,0x02,0x78,0x02,0x80,0x02, - 0x88,0x02,0x90,0x02,0x98,0x02,0xa0,0x02,0xa8,0x02,0xb0,0x02,0xb8,0x02,0xc0,0x02,0xc8,0x02, - 0xd0,0x02,0xd8,0x02,0xe0,0x02,0xe8,0x02,0xf0,0x02,0xf8,0x02, + 0x00,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x38,0x00,0x40,0x00, + 0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00, + 0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00, + 0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x00,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01, + 0x20,0x01,0x28,0x01,0x30,0x01,0x38,0x01,0x40,0x01,0x48,0x01,0x50,0x01,0x58,0x01,0x60,0x01, + 0x68,0x01,0x70,0x01,0x78,0x01,0x80,0x01,0x88,0x01,0x90,0x01,0x98,0x01,0xa0,0x01,0xa8,0x01, + 0xb0,0x01,0xb8,0x01,0xc0,0x01,0xc8,0x01,0xd0,0x01,0xd8,0x01,0xe0,0x01,0xe8,0x01,0xf0,0x01, + 0xf8,0x01,0x00,0x02,0x08,0x02,0x10,0x02,0x18,0x02,0x20,0x02,0x28,0x02,0x30,0x02,0x38,0x02, + 0x40,0x02,0x48,0x02,0x50,0x02,0x58,0x02,0x60,0x02,0x68,0x02,0x70,0x02,0x78,0x02,0x80,0x02, + 0x88,0x02,0x90,0x02,0x98,0x02,0xa0,0x02,0xa8,0x02,0xb0,0x02,0xb8,0x02,0xc0,0x02,0xc8,0x02, + 0xd0,0x02,0xd8,0x02,0xe0,0x02,0xe8,0x02,0xf0,0x02,0xf8,0x02, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x00,0x20,0x00, + 5, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x00,0x20,0x00, - 5, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x50,0x50,0x00,0x00,0x00,0x00, - 5, // 0x23 '#' - 0x00,0x50,0xf8,0x50,0xf8,0x50,0x00, + 5, // 0x23 '#' + 0x00,0x50,0xf8,0x50,0xf8,0x50,0x00, - 5, // 0x24 '$' - 0x20,0x78,0xa0,0x70,0x28,0xf0,0x20, + 5, // 0x24 '$' + 0x20,0x78,0xa0,0x70,0x28,0xf0,0x20, - 5, // 0x25 '%' - 0x00,0x88,0x10,0x20,0x40,0x88,0x00, + 5, // 0x25 '%' + 0x00,0x88,0x10,0x20,0x40,0x88,0x00, - 5, // 0x26 '&' - 0x00,0x40,0xa0,0x68,0x90,0x68,0x00, + 5, // 0x26 '&' + 0x00,0x40,0xa0,0x68,0x90,0x68,0x00, - 5, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x20,0x20,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x20,0x10, + 5, // 0x28 '(' + 0x10,0x20,0x40,0x40,0x40,0x20,0x10, - 5, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x40,0x80, + 5, // 0x29 ')' + 0x80,0x40,0x20,0x20,0x20,0x40,0x80, - 5, // 0x2a '*' - 0x00,0x20,0xa8,0x70,0xa8,0x20,0x00, + 5, // 0x2a '*' + 0x00,0x20,0xa8,0x70,0xa8,0x20,0x00, - 5, // 0x2b '+' - 0x00,0x20,0x20,0xf8,0x20,0x20,0x00, + 5, // 0x2b '+' + 0x00,0x20,0x20,0xf8,0x20,0x20,0x00, - 5, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x20,0x20,0x40, + 5, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x20,0x20,0x40, - 5, // 0x2d '-' - 0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 5, // 0x2d '-' + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00, - 5, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x40,0x00, + 5, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x40,0x00, - 5, // 0x2f '/' - 0x00,0x08,0x10,0x20,0x40,0x80,0x00, + 5, // 0x2f '/' + 0x00,0x08,0x10,0x20,0x40,0x80,0x00, - 5, // 0x30 '0' - 0x00,0x60,0x90,0x90,0x90,0x60,0x00, + 5, // 0x30 '0' + 0x00,0x60,0x90,0x90,0x90,0x60,0x00, - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x70,0x00, + 5, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x70,0x00, - 5, // 0x32 '2' - 0x00,0x60,0x90,0x20,0x40,0xf0,0x00, + 5, // 0x32 '2' + 0x00,0x60,0x90,0x20,0x40,0xf0,0x00, - 5, // 0x33 '3' - 0x00,0xf0,0x20,0x60,0x10,0xe0,0x00, + 5, // 0x33 '3' + 0x00,0xf0,0x20,0x60,0x10,0xe0,0x00, - 5, // 0x34 '4' - 0x00,0x30,0x50,0x90,0xf0,0x10,0x00, + 5, // 0x34 '4' + 0x00,0x30,0x50,0x90,0xf0,0x10,0x00, - 5, // 0x35 '5' - 0x00,0xf0,0x80,0xe0,0x10,0xe0,0x00, + 5, // 0x35 '5' + 0x00,0xf0,0x80,0xe0,0x10,0xe0,0x00, - 5, // 0x36 '6' - 0x00,0x60,0x80,0xe0,0x90,0x60,0x00, + 5, // 0x36 '6' + 0x00,0x60,0x80,0xe0,0x90,0x60,0x00, - 5, // 0x37 '7' - 0x00,0xf0,0x90,0x20,0x40,0x40,0x00, + 5, // 0x37 '7' + 0x00,0xf0,0x90,0x20,0x40,0x40,0x00, - 5, // 0x38 '8' - 0x00,0x60,0x90,0x60,0x90,0x60,0x00, + 5, // 0x38 '8' + 0x00,0x60,0x90,0x60,0x90,0x60,0x00, - 5, // 0x39 '9' - 0x00,0x60,0x90,0x70,0x10,0x60,0x00, + 5, // 0x39 '9' + 0x00,0x60,0x90,0x70,0x10,0x60,0x00, - 5, // 0x3a ':' - 0x00,0x00,0x20,0x00,0x20,0x00,0x00, + 5, // 0x3a ':' + 0x00,0x00,0x20,0x00,0x20,0x00,0x00, - 5, // 0x3b ';' - 0x00,0x00,0x20,0x00,0x20,0x20,0x40, + 5, // 0x3b ';' + 0x00,0x00,0x20,0x00,0x20,0x20,0x40, - 5, // 0x3c '<' - 0x00,0x10,0x20,0x40,0x20,0x10,0x00, + 5, // 0x3c '<' + 0x00,0x10,0x20,0x40,0x20,0x10,0x00, - 5, // 0x3d '=' - 0x00,0x00,0xf0,0x00,0xf0,0x00,0x00, + 5, // 0x3d '=' + 0x00,0x00,0xf0,0x00,0xf0,0x00,0x00, - 5, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x40,0x80,0x00, + 5, // 0x3e '>' + 0x00,0x80,0x40,0x20,0x40,0x80,0x00, - 5, // 0x3f '?' - 0x00,0x60,0x90,0x20,0x00,0x20,0x00, + 5, // 0x3f '?' + 0x00,0x60,0x90,0x20,0x00,0x20,0x00, - 5, // 0x40 '@' - 0x00,0x60,0x90,0xb0,0x80,0x70,0x00, + 5, // 0x40 '@' + 0x00,0x60,0x90,0xb0,0x80,0x70,0x00, - 5, // 0x41 'A' - 0x00,0x60,0x90,0xf0,0x90,0x90,0x00, + 5, // 0x41 'A' + 0x00,0x60,0x90,0xf0,0x90,0x90,0x00, - 5, // 0x42 'B' - 0x00,0xe0,0x90,0xe0,0x90,0xe0,0x00, + 5, // 0x42 'B' + 0x00,0xe0,0x90,0xe0,0x90,0xe0,0x00, - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x90,0x60,0x00, + 5, // 0x43 'C' + 0x00,0x60,0x90,0x80,0x90,0x60,0x00, - 5, // 0x44 'D' - 0x00,0xe0,0x90,0x90,0x90,0xe0,0x00, + 5, // 0x44 'D' + 0x00,0xe0,0x90,0x90,0x90,0xe0,0x00, - 5, // 0x45 'E' - 0x00,0xf0,0x80,0xe0,0x80,0xf0,0x00, + 5, // 0x45 'E' + 0x00,0xf0,0x80,0xe0,0x80,0xf0,0x00, - 5, // 0x46 'F' - 0x00,0xf0,0x80,0xe0,0x80,0x80,0x00, + 5, // 0x46 'F' + 0x00,0xf0,0x80,0xe0,0x80,0x80,0x00, - 5, // 0x47 'G' - 0x00,0x70,0x80,0xb0,0x90,0x60,0x00, + 5, // 0x47 'G' + 0x00,0x70,0x80,0xb0,0x90,0x60,0x00, - 5, // 0x48 'H' - 0x00,0x90,0x90,0xf0,0x90,0x90,0x00, + 5, // 0x48 'H' + 0x00,0x90,0x90,0xf0,0x90,0x90,0x00, - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x70,0x00, + 5, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x70,0x00, - 5, // 0x4a 'J' - 0x00,0x70,0x20,0x20,0xa0,0x40,0x00, + 5, // 0x4a 'J' + 0x00,0x70,0x20,0x20,0xa0,0x40,0x00, - 5, // 0x4b 'K' - 0x00,0x90,0xa0,0xc0,0xa0,0x90,0x00, + 5, // 0x4b 'K' + 0x00,0x90,0xa0,0xc0,0xa0,0x90,0x00, - 5, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0xf0,0x00, + 5, // 0x4c 'L' + 0x00,0x80,0x80,0x80,0x80,0xf0,0x00, - 5, // 0x4d 'M' - 0x00,0x90,0xf0,0x90,0x90,0x90,0x00, + 5, // 0x4d 'M' + 0x00,0x90,0xf0,0x90,0x90,0x90,0x00, - 5, // 0x4e 'N' - 0x00,0x90,0xd0,0xb0,0x90,0x90,0x00, + 5, // 0x4e 'N' + 0x00,0x90,0xd0,0xb0,0x90,0x90,0x00, - 5, // 0x4f 'O' - 0x00,0x60,0x90,0x90,0x90,0x60,0x00, + 5, // 0x4f 'O' + 0x00,0x60,0x90,0x90,0x90,0x60,0x00, - 5, // 0x50 'P' - 0x00,0xe0,0x90,0xe0,0x80,0x80,0x00, + 5, // 0x50 'P' + 0x00,0xe0,0x90,0xe0,0x80,0x80,0x00, - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0xa0,0x50,0x00, + 5, // 0x51 'Q' + 0x00,0x60,0x90,0x90,0xa0,0x50,0x00, - 5, // 0x52 'R' - 0x00,0xe0,0x90,0xe0,0xa0,0x90,0x00, + 5, // 0x52 'R' + 0x00,0xe0,0x90,0xe0,0xa0,0x90,0x00, - 5, // 0x53 'S' - 0x00,0x70,0x80,0x60,0x10,0xe0,0x00, + 5, // 0x53 'S' + 0x00,0x70,0x80,0x60,0x10,0xe0,0x00, - 5, // 0x54 'T' - 0x00,0x70,0x20,0x20,0x20,0x20,0x00, + 5, // 0x54 'T' + 0x00,0x70,0x20,0x20,0x20,0x20,0x00, - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x55 'U' + 0x00,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x56 'V' - 0x00,0x50,0x50,0x50,0x20,0x20,0x00, + 5, // 0x56 'V' + 0x00,0x50,0x50,0x50,0x20,0x20,0x00, - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0xf0,0x90,0x00, + 5, // 0x57 'W' + 0x00,0x90,0x90,0x90,0xf0,0x90,0x00, - 5, // 0x58 'X' - 0x00,0x90,0x90,0x60,0x90,0x90,0x00, + 5, // 0x58 'X' + 0x00,0x90,0x90,0x60,0x90,0x90,0x00, - 5, // 0x59 'Y' - 0x00,0x50,0x50,0x20,0x20,0x20,0x00, + 5, // 0x59 'Y' + 0x00,0x50,0x50,0x20,0x20,0x20,0x00, - 5, // 0x5a 'Z' - 0x00,0xf0,0x10,0x20,0x40,0xf0,0x00, + 5, // 0x5a 'Z' + 0x00,0xf0,0x10,0x20,0x40,0xf0,0x00, - 5, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x70, + 5, // 0x5b '[' + 0x70,0x40,0x40,0x40,0x40,0x40,0x70, - 5, // 0x5c '\' - 0x00,0x80,0x40,0x20,0x10,0x08,0x00, + 5, // 0x5c '\' + 0x00,0x80,0x40,0x20,0x10,0x08,0x00, - 5, // 0x5d ']' - 0xe0,0x20,0x20,0x20,0x20,0x20,0xe0, + 5, // 0x5d ']' + 0xe0,0x20,0x20,0x20,0x20,0x20,0xe0, - 5, // 0x5e '^' - 0x00,0x20,0x50,0x00,0x00,0x00,0x00, + 5, // 0x5e '^' + 0x00,0x20,0x50,0x00,0x00,0x00,0x00, - 5, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0xf8,0x00, + 5, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00, + 5, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00, - 5, // 0x61 'a' - 0x00,0x00,0x60,0xa0,0xa0,0x50,0x00, + 5, // 0x61 'a' + 0x00,0x00,0x60,0xa0,0xa0,0x50,0x00, - 5, // 0x62 'b' - 0x00,0x80,0x80,0xe0,0x90,0xe0,0x00, + 5, // 0x62 'b' + 0x00,0x80,0x80,0xe0,0x90,0xe0,0x00, - 5, // 0x63 'c' - 0x00,0x00,0x70,0x80,0x80,0x70,0x00, + 5, // 0x63 'c' + 0x00,0x00,0x70,0x80,0x80,0x70,0x00, - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x70,0x00, + 5, // 0x64 'd' + 0x00,0x10,0x10,0x70,0x90,0x70,0x00, - 5, // 0x65 'e' - 0x00,0x00,0x60,0xf0,0x80,0x70,0x00, + 5, // 0x65 'e' + 0x00,0x00,0x60,0xf0,0x80,0x70,0x00, - 5, // 0x66 'f' - 0x00,0x30,0x40,0xe0,0x40,0x40,0x00, + 5, // 0x66 'f' + 0x00,0x30,0x40,0xe0,0x40,0x40,0x00, - 5, // 0x67 'g' - 0x00,0x00,0x70,0x90,0x70,0x10,0x60, + 5, // 0x67 'g' + 0x00,0x00,0x70,0x90,0x70,0x10,0x60, - 5, // 0x68 'h' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x00, + 5, // 0x68 'h' + 0x00,0x80,0x80,0xe0,0x90,0x90,0x00, - 5, // 0x69 'i' - 0x20,0x00,0x60,0x20,0x20,0x70,0x00, + 5, // 0x69 'i' + 0x20,0x00,0x60,0x20,0x20,0x70,0x00, - 5, // 0x6a 'j' - 0x20,0x00,0x60,0x20,0x20,0xa0,0x40, + 5, // 0x6a 'j' + 0x20,0x00,0x60,0x20,0x20,0xa0,0x40, - 5, // 0x6b 'k' - 0x80,0x80,0x90,0xa0,0xe0,0x90,0x00, + 5, // 0x6b 'k' + 0x80,0x80,0x90,0xa0,0xe0,0x90,0x00, - 5, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x70,0x00, + 5, // 0x6c 'l' + 0x00,0x60,0x20,0x20,0x20,0x70,0x00, - 5, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0x90,0x00, + 5, // 0x6d 'm' + 0x00,0x00,0xa0,0xf0,0xf0,0x90,0x00, - 5, // 0x6e 'n' - 0x00,0x00,0xa0,0xd0,0x90,0x90,0x00, + 5, // 0x6e 'n' + 0x00,0x00,0xa0,0xd0,0x90,0x90,0x00, - 5, // 0x6f 'o' - 0x00,0x00,0x60,0x90,0x90,0x60,0x00, + 5, // 0x6f 'o' + 0x00,0x00,0x60,0x90,0x90,0x60,0x00, - 5, // 0x70 'p' - 0x00,0x00,0xe0,0x90,0xe0,0x80,0x80, + 5, // 0x70 'p' + 0x00,0x00,0xe0,0x90,0xe0,0x80,0x80, - 5, // 0x71 'q' - 0x00,0x00,0x70,0x90,0x70,0x10,0x10, + 5, // 0x71 'q' + 0x00,0x00,0x70,0x90,0x70,0x10,0x10, - 5, // 0x72 'r' - 0x00,0x00,0xe0,0x90,0x80,0x80,0x00, + 5, // 0x72 'r' + 0x00,0x00,0xe0,0x90,0x80,0x80,0x00, - 5, // 0x73 's' - 0x00,0x00,0x70,0xe0,0x10,0xe0,0x00, + 5, // 0x73 's' + 0x00,0x00,0x70,0xe0,0x10,0xe0,0x00, - 5, // 0x74 't' - 0x40,0x40,0xe0,0x40,0x40,0x70,0x00, + 5, // 0x74 't' + 0x40,0x40,0xe0,0x40,0x40,0x70,0x00, - 5, // 0x75 'u' - 0x00,0x00,0x90,0x90,0x90,0x70,0x00, + 5, // 0x75 'u' + 0x00,0x00,0x90,0x90,0x90,0x70,0x00, - 5, // 0x76 'v' - 0x00,0x00,0x50,0x50,0x50,0x20,0x00, + 5, // 0x76 'v' + 0x00,0x00,0x50,0x50,0x50,0x20,0x00, - 5, // 0x77 'w' - 0x00,0x00,0x90,0x90,0xf0,0x90,0x00, + 5, // 0x77 'w' + 0x00,0x00,0x90,0x90,0xf0,0x90,0x00, - 5, // 0x78 'x' - 0x00,0x00,0x90,0x60,0x60,0x90,0x00, + 5, // 0x78 'x' + 0x00,0x00,0x90,0x60,0x60,0x90,0x00, - 5, // 0x79 'y' - 0x00,0x00,0x90,0x90,0x70,0x10,0x60, + 5, // 0x79 'y' + 0x00,0x00,0x90,0x90,0x70,0x10,0x60, - 5, // 0x7a 'z' - 0x00,0x00,0xf0,0x20,0x40,0xf0,0x00, + 5, // 0x7a 'z' + 0x00,0x00,0xf0,0x20,0x40,0xf0,0x00, - 5, // 0x7b '{' - 0x10,0x20,0x20,0xc0,0x20,0x20,0x10, + 5, // 0x7b '{' + 0x10,0x20,0x20,0xc0,0x20,0x20,0x10, - 5, // 0x7c '|' - 0x20,0x20,0x20,0x00,0x20,0x20,0x20, + 5, // 0x7c '|' + 0x20,0x20,0x20,0x00,0x20,0x20,0x20, - 5, // 0x7d '}' - 0x40,0x20,0x20,0x18,0x20,0x20,0x40, + 5, // 0x7d '}' + 0x40,0x20,0x20,0x18,0x20,0x20,0x40, - 5, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00, + 5, // 0x7e '~' + 0x00,0x40,0xa8,0x10,0x00,0x00,0x00, - 5, // 0x7f '' - 0x00,0x00,0x20,0x50,0x88,0xf8,0x00, - 0 - }; + 5, // 0x7f '' + 0x00,0x00,0x20,0x50,0x88,0xf8,0x00, + 0 +}; - const int8u gse5x9[] = - { - 9, 0, 32, 128-32, +const int8u gse5x9[] = +{ + 9, 0, 32, 128-32, - 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, - 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, - 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, - 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, - 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, - 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, - 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, - 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, - 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, - 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, - 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, + 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, + 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, + 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, + 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, + 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, + 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, + 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, + 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, + 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, + 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, + 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, + 5, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - 5, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, + 5, // 0x23 '#' + 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, - 5, // 0x24 '$' - 0x00,0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00, + 5, // 0x24 '$' + 0x00,0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00, - 5, // 0x25 '%' - 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, + 5, // 0x25 '%' + 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, - 5, // 0x26 '&' - 0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x00, + 5, // 0x26 '&' + 0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x00, - 5, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, + 5, // 0x28 '(' + 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - 5, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x80, + 5, // 0x29 ')' + 0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x80, - 5, // 0x2a '*' - 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, + 5, // 0x2a '*' + 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, - 5, // 0x2b '+' - 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, + 5, // 0x2b '+' + 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, - 5, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, + 5, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, - 5, // 0x2d '-' - 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 5, // 0x2d '-' + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, - 5, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, + 5, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - 5, // 0x2f '/' - 0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, + 5, // 0x2f '/' + 0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, - 5, // 0x30 '0' - 0x00,0x60,0x90,0xb0,0xd0,0x90,0x90,0x60,0x00, + 5, // 0x30 '0' + 0x00,0x60,0x90,0xb0,0xd0,0x90,0x90,0x60,0x00, - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x32 '2' - 0x00,0x60,0x90,0x10,0x20,0x40,0x80,0xf0,0x00, + 5, // 0x32 '2' + 0x00,0x60,0x90,0x10,0x20,0x40,0x80,0xf0,0x00, - 5, // 0x33 '3' - 0x00,0xf0,0x10,0x20,0x60,0x10,0x90,0x60,0x00, + 5, // 0x33 '3' + 0x00,0xf0,0x10,0x20,0x60,0x10,0x90,0x60,0x00, - 5, // 0x34 '4' - 0x00,0x30,0x50,0x90,0x90,0xf8,0x10,0x10,0x00, + 5, // 0x34 '4' + 0x00,0x30,0x50,0x90,0x90,0xf8,0x10,0x10,0x00, - 5, // 0x35 '5' - 0x00,0xf0,0x80,0xe0,0x10,0x10,0x10,0xe0,0x00, + 5, // 0x35 '5' + 0x00,0xf0,0x80,0xe0,0x10,0x10,0x10,0xe0,0x00, - 5, // 0x36 '6' - 0x00,0x60,0x80,0xe0,0x90,0x90,0x90,0x60,0x00, + 5, // 0x36 '6' + 0x00,0x60,0x80,0xe0,0x90,0x90,0x90,0x60,0x00, - 5, // 0x37 '7' - 0x00,0xf0,0x90,0x10,0x20,0x40,0x40,0x40,0x00, + 5, // 0x37 '7' + 0x00,0xf0,0x90,0x10,0x20,0x40,0x40,0x40,0x00, - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x60,0x00, + 5, // 0x38 '8' + 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x60,0x00, - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x70,0x10,0x90,0x60,0x00, + 5, // 0x39 '9' + 0x00,0x60,0x90,0x90,0x70,0x10,0x90,0x60,0x00, - 5, // 0x3a ':' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, + 5, // 0x3a ':' + 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, - 5, // 0x3b ';' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, + 5, // 0x3b ';' + 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, - 5, // 0x3c '<' - 0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00, + 5, // 0x3c '<' + 0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00, - 5, // 0x3d '=' - 0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, + 5, // 0x3d '=' + 0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, - 5, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, + 5, // 0x3e '>' + 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, - 5, // 0x3f '?' - 0x00,0x60,0x90,0x10,0x20,0x20,0x00,0x20,0x00, + 5, // 0x3f '?' + 0x00,0x60,0x90,0x10,0x20,0x20,0x00,0x20,0x00, - 5, // 0x40 '@' - 0x00,0x60,0x90,0xb0,0xb0,0xb0,0x80,0x70,0x00, + 5, // 0x40 '@' + 0x00,0x60,0x90,0xb0,0xb0,0xb0,0x80,0x70,0x00, - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, + 5, // 0x41 'A' + 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, - 5, // 0x42 'B' - 0x00,0xe0,0x90,0x90,0xe0,0x90,0x90,0xe0,0x00, + 5, // 0x42 'B' + 0x00,0xe0,0x90,0x90,0xe0,0x90,0x90,0xe0,0x00, - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, + 5, // 0x43 'C' + 0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, - 5, // 0x44 'D' - 0x00,0xe0,0x90,0x90,0x90,0x90,0x90,0xe0,0x00, + 5, // 0x44 'D' + 0x00,0xe0,0x90,0x90,0x90,0x90,0x90,0xe0,0x00, - 5, // 0x45 'E' - 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0xf0,0x00, + 5, // 0x45 'E' + 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0xf0,0x00, - 5, // 0x46 'F' - 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0x80,0x00, + 5, // 0x46 'F' + 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0x80,0x00, - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0xb0,0x90,0x90,0x60,0x00, + 5, // 0x47 'G' + 0x00,0x60,0x90,0x80,0xb0,0x90,0x90,0x60,0x00, - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, + 5, // 0x48 'H' + 0x00,0x90,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x4a 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, + 5, // 0x4a 'J' + 0x00,0x70,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, - 5, // 0x4b 'K' - 0x00,0x90,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, + 5, // 0x4b 'K' + 0x00,0x90,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, - 5, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, + 5, // 0x4c 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, - 5, // 0x4d 'M' - 0x00,0x90,0xf0,0x90,0x90,0x90,0x90,0x90,0x00, + 5, // 0x4d 'M' + 0x00,0x90,0xf0,0x90,0x90,0x90,0x90,0x90,0x00, - 5, // 0x4e 'N' - 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x90,0x00, + 5, // 0x4e 'N' + 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x90,0x00, - 5, // 0x4f 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x4f 'O' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x50 'P' - 0x00,0xe0,0x90,0x90,0xe0,0x80,0x80,0x80,0x00, + 5, // 0x50 'P' + 0x00,0xe0,0x90,0x90,0xe0,0x80,0x80,0x80,0x00, - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0xa0,0x50,0x00, + 5, // 0x51 'Q' + 0x00,0x60,0x90,0x90,0x90,0x90,0xa0,0x50,0x00, - 5, // 0x52 'R' - 0x00,0xe0,0x90,0x90,0xe0,0xa0,0x90,0x90,0x00, + 5, // 0x52 'R' + 0x00,0xe0,0x90,0x90,0xe0,0xa0,0x90,0x90,0x00, - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x00, + 5, // 0x53 'S' + 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x00, - 5, // 0x54 'T' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 5, // 0x54 'T' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x55 'U' + 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x56 'V' - 0x00,0x50,0x50,0x50,0x50,0x50,0x20,0x20,0x00, + 5, // 0x56 'V' + 0x00,0x50,0x50,0x50,0x50,0x50,0x20,0x20,0x00, - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, + 5, // 0x57 'W' + 0x00,0x90,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, - 5, // 0x58 'X' - 0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, + 5, // 0x58 'X' + 0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - 5, // 0x59 'Y' - 0x00,0x50,0x50,0x50,0x20,0x20,0x20,0x20,0x00, + 5, // 0x59 'Y' + 0x00,0x50,0x50,0x50,0x20,0x20,0x20,0x20,0x00, - 5, // 0x5a 'Z' - 0x00,0xf0,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, + 5, // 0x5a 'Z' + 0x00,0xf0,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, - 5, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, + 5, // 0x5b '[' + 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - 5, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x00, + 5, // 0x5c '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x00, - 5, // 0x5d ']' - 0xe0,0x20,0x20,0x20,0x20,0x20,0x20,0xe0,0x00, + 5, // 0x5d ']' + 0xe0,0x20,0x20,0x20,0x20,0x20,0x20,0xe0,0x00, - 5, // 0x5e '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00, + 5, // 0x5e '^' + 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00, - 5, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, + 5, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x61 'a' - 0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, + 5, // 0x61 'a' + 0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, - 5, // 0x62 'b' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0xe0,0x00, + 5, // 0x62 'b' + 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0xe0,0x00, - 5, // 0x63 'c' - 0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, + 5, // 0x63 'c' + 0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x70,0x00, + 5, // 0x64 'd' + 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x70,0x00, - 5, // 0x65 'e' - 0x00,0x00,0x60,0x90,0xf0,0x80,0x80,0x70,0x00, + 5, // 0x65 'e' + 0x00,0x00,0x60,0x90,0xf0,0x80,0x80,0x70,0x00, - 5, // 0x66 'f' - 0x00,0x30,0x40,0x40,0xe0,0x40,0x40,0x40,0x00, + 5, // 0x66 'f' + 0x00,0x30,0x40,0x40,0xe0,0x40,0x40,0x40,0x00, - 5, // 0x67 'g' - 0x00,0x00,0x70,0x90,0x90,0x70,0x10,0x90,0x60, + 5, // 0x67 'g' + 0x00,0x00,0x70,0x90,0x90,0x70,0x10,0x90,0x60, - 5, // 0x68 'h' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0x90,0x00, + 5, // 0x68 'h' + 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0x90,0x00, - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, + 5, // 0x69 'i' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, - 5, // 0x6a 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0xa0,0x40, + 5, // 0x6a 'j' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0xa0,0x40, - 5, // 0x6b 'k' - 0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x00, + 5, // 0x6b 'k' + 0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x00, - 5, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x6c 'l' + 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x90,0x00, + 5, // 0x6d 'm' + 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x90,0x00, - 5, // 0x6e 'n' - 0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, + 5, // 0x6e 'n' + 0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, - 5, // 0x6f 'o' - 0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x6f 'o' + 0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x70 'p' - 0x00,0x00,0xe0,0x90,0x90,0x90,0xe0,0x80,0x80, + 5, // 0x70 'p' + 0x00,0x00,0xe0,0x90,0x90,0x90,0xe0,0x80,0x80, - 5, // 0x71 'q' - 0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, + 5, // 0x71 'q' + 0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, - 5, // 0x72 'r' - 0x00,0x00,0xe0,0x90,0x80,0x80,0x80,0x80,0x00, + 5, // 0x72 'r' + 0x00,0x00,0xe0,0x90,0x80,0x80,0x80,0x80,0x00, - 5, // 0x73 's' - 0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, + 5, // 0x73 's' + 0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, - 5, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x50,0x20,0x00, + 5, // 0x74 't' + 0x00,0x40,0x40,0xe0,0x40,0x40,0x50,0x20,0x00, - 5, // 0x75 'u' - 0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, + 5, // 0x75 'u' + 0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - 5, // 0x76 'v' - 0x00,0x00,0x50,0x50,0x50,0x50,0x20,0x20,0x00, + 5, // 0x76 'v' + 0x00,0x00,0x50,0x50,0x50,0x50,0x20,0x20,0x00, - 5, // 0x77 'w' - 0x00,0x00,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, + 5, // 0x77 'w' + 0x00,0x00,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, - 5, // 0x78 'x' - 0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, + 5, // 0x78 'x' + 0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, - 5, // 0x79 'y' - 0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xe0, + 5, // 0x79 'y' + 0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xe0, - 5, // 0x7a 'z' - 0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, + 5, // 0x7a 'z' + 0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, - 5, // 0x7b '{' - 0x10,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x10, + 5, // 0x7b '{' + 0x10,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x10, - 5, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, + 5, // 0x7c '|' + 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, - 5, // 0x7d '}' - 0x80,0x40,0x40,0x40,0x30,0x40,0x40,0x40,0x80, + 5, // 0x7d '}' + 0x80,0x40,0x40,0x40,0x30,0x40,0x40,0x40,0x80, - 5, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, + 5, // 0x7e '~' + 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, - 5, // 0x7f '' - 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, - 0 - }; + 5, // 0x7f '' + 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, + 0 +}; - const int8u gse6x12[] = - { - 12, 0, 32, 128-32, +const int8u gse6x12[] = +{ + 12, 0, 32, 128-32, - 0x00,0x00,0x0d,0x00,0x1a,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4e,0x00,0x5b,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8f,0x00,0x9c,0x00,0xa9,0x00,0xb6,0x00,0xc3,0x00,0xd0,0x00,0xdd,0x00, - 0xea,0x00,0xf7,0x00,0x04,0x01,0x11,0x01,0x1e,0x01,0x2b,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5f,0x01,0x6c,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xa0,0x01,0xad,0x01,0xba,0x01,0xc7,0x01, - 0xd4,0x01,0xe1,0x01,0xee,0x01,0xfb,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2f,0x02,0x3c,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7d,0x02,0x8a,0x02,0x97,0x02,0xa4,0x02,0xb1,0x02, - 0xbe,0x02,0xcb,0x02,0xd8,0x02,0xe5,0x02,0xf2,0x02,0xff,0x02,0x0c,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4d,0x03,0x5a,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8e,0x03,0x9b,0x03, - 0xa8,0x03,0xb5,0x03,0xc2,0x03,0xcf,0x03,0xdc,0x03,0xe9,0x03,0xf6,0x03,0x03,0x04,0x10,0x04, - 0x1d,0x04,0x2a,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x6b,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9f,0x04,0xac,0x04,0xb9,0x04,0xc6,0x04,0xd3,0x04, + 0x00,0x00,0x0d,0x00,0x1a,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4e,0x00,0x5b,0x00,0x68,0x00, + 0x75,0x00,0x82,0x00,0x8f,0x00,0x9c,0x00,0xa9,0x00,0xb6,0x00,0xc3,0x00,0xd0,0x00,0xdd,0x00, + 0xea,0x00,0xf7,0x00,0x04,0x01,0x11,0x01,0x1e,0x01,0x2b,0x01,0x38,0x01,0x45,0x01,0x52,0x01, + 0x5f,0x01,0x6c,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xa0,0x01,0xad,0x01,0xba,0x01,0xc7,0x01, + 0xd4,0x01,0xe1,0x01,0xee,0x01,0xfb,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2f,0x02,0x3c,0x02, + 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7d,0x02,0x8a,0x02,0x97,0x02,0xa4,0x02,0xb1,0x02, + 0xbe,0x02,0xcb,0x02,0xd8,0x02,0xe5,0x02,0xf2,0x02,0xff,0x02,0x0c,0x03,0x19,0x03,0x26,0x03, + 0x33,0x03,0x40,0x03,0x4d,0x03,0x5a,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8e,0x03,0x9b,0x03, + 0xa8,0x03,0xb5,0x03,0xc2,0x03,0xcf,0x03,0xdc,0x03,0xe9,0x03,0xf6,0x03,0x03,0x04,0x10,0x04, + 0x1d,0x04,0x2a,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x6b,0x04,0x78,0x04,0x85,0x04, + 0x92,0x04,0x9f,0x04,0xac,0x04,0xb9,0x04,0xc6,0x04,0xd3,0x04, - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 6, // 0x22 '"' - 0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x22 '"' + 0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0x50,0x50,0xf8,0x50,0x50,0x00,0x00, + 6, // 0x23 '#' + 0x00,0x50,0x50,0xf8,0x50,0x50,0x50,0xf8,0x50,0x50,0x00,0x00, - 6, // 0x24 '$' - 0x00,0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x00,0x00, + 6, // 0x24 '$' + 0x00,0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x00,0x00, - 6, // 0x25 '%' - 0x00,0xc8,0xd8,0x10,0x30,0x20,0x60,0x40,0xd8,0x98,0x00,0x00, + 6, // 0x25 '%' + 0x00,0xc8,0xd8,0x10,0x30,0x20,0x60,0x40,0xd8,0x98,0x00,0x00, - 6, // 0x26 '&' - 0x00,0x60,0x90,0x90,0x90,0x60,0xa8,0x90,0x90,0x68,0x00,0x00, + 6, // 0x26 '&' + 0x00,0x60,0x90,0x90,0x90,0x60,0xa8,0x90,0x90,0x68,0x00,0x00, - 6, // 0x27 ''' - 0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x27 ''' + 0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00, + 6, // 0x28 '(' + 0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00, - 6, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, + 6, // 0x29 ')' + 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, - 6, // 0x2a '*' - 0x00,0x00,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x00,0x00, + 6, // 0x2a '*' + 0x00,0x00,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x00,0x00, - 6, // 0x2b '+' - 0x00,0x00,0x20,0x20,0x20,0xf8,0x20,0x20,0x20,0x00,0x00,0x00, + 6, // 0x2b '+' + 0x00,0x00,0x20,0x20,0x20,0xf8,0x20,0x20,0x20,0x00,0x00,0x00, - 6, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, + 6, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - 6, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, + 6, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, - 6, // 0x2f '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00,0x00, + 6, // 0x2f '/' + 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00,0x00, - 6, // 0x30 '0' - 0x00,0x70,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x70,0x00,0x00, + 6, // 0x30 '0' + 0x00,0x70,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x70,0x00,0x00, - 6, // 0x31 '1' - 0x00,0x20,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 6, // 0x31 '1' + 0x00,0x20,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 6, // 0x32 '2' - 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, + 6, // 0x32 '2' + 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, - 6, // 0x33 '3' - 0x00,0xf8,0x10,0x20,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00, + 6, // 0x33 '3' + 0x00,0xf8,0x10,0x20,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00, - 6, // 0x34 '4' - 0x00,0x10,0x20,0x40,0x90,0x90,0xf8,0x10,0x10,0x10,0x00,0x00, + 6, // 0x34 '4' + 0x00,0x10,0x20,0x40,0x90,0x90,0xf8,0x10,0x10,0x10,0x00,0x00, - 6, // 0x35 '5' - 0x00,0xf8,0x80,0x80,0xf0,0x08,0x08,0x08,0x88,0x70,0x00,0x00, + 6, // 0x35 '5' + 0x00,0xf8,0x80,0x80,0xf0,0x08,0x08,0x08,0x88,0x70,0x00,0x00, - 6, // 0x36 '6' - 0x00,0x70,0x88,0x80,0x80,0xf0,0x88,0x88,0x88,0x70,0x00,0x00, + 6, // 0x36 '6' + 0x00,0x70,0x88,0x80,0x80,0xf0,0x88,0x88,0x88,0x70,0x00,0x00, - 6, // 0x37 '7' - 0x00,0xf8,0x88,0x08,0x08,0x10,0x20,0x20,0x20,0x20,0x00,0x00, + 6, // 0x37 '7' + 0x00,0xf8,0x88,0x08,0x08,0x10,0x20,0x20,0x20,0x20,0x00,0x00, - 6, // 0x38 '8' - 0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, + 6, // 0x38 '8' + 0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, - 6, // 0x39 '9' - 0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00, + 6, // 0x39 '9' + 0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00, - 6, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, + 6, // 0x3a ':' + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, - 6, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, + 6, // 0x3b ';' + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - 6, // 0x3c '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00, + 6, // 0x3c '<' + 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00, - 6, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00,0x00,0x00, + 6, // 0x3d '=' + 0x00,0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00,0x00,0x00, - 6, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00, + 6, // 0x3e '>' + 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00, - 6, // 0x3f '?' - 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, + 6, // 0x3f '?' + 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - 6, // 0x40 '@' - 0x00,0x70,0x88,0x88,0xb8,0xb8,0xb0,0x80,0x88,0x70,0x00,0x00, + 6, // 0x40 '@' + 0x00,0x70,0x88,0x88,0xb8,0xb8,0xb0,0x80,0x88,0x70,0x00,0x00, - 6, // 0x41 'A' - 0x00,0x20,0x50,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00,0x00, + 6, // 0x41 'A' + 0x00,0x20,0x50,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00,0x00, - 6, // 0x42 'B' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00,0x00, + 6, // 0x42 'B' + 0x00,0xf0,0x88,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00,0x00, - 6, // 0x43 'C' - 0x00,0x70,0x88,0x88,0x80,0x80,0x80,0x88,0x88,0x70,0x00,0x00, + 6, // 0x43 'C' + 0x00,0x70,0x88,0x88,0x80,0x80,0x80,0x88,0x88,0x70,0x00,0x00, - 6, // 0x44 'D' - 0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x88,0x90,0xe0,0x00,0x00, + 6, // 0x44 'D' + 0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x88,0x90,0xe0,0x00,0x00, - 6, // 0x45 'E' - 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0xf8,0x00,0x00, + 6, // 0x45 'E' + 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0xf8,0x00,0x00, - 6, // 0x46 'F' - 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, + 6, // 0x46 'F' + 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, - 6, // 0x47 'G' - 0x00,0x70,0x88,0x80,0x80,0xb8,0x88,0x88,0x88,0x70,0x00,0x00, + 6, // 0x47 'G' + 0x00,0x70,0x88,0x80,0x80,0xb8,0x88,0x88,0x88,0x70,0x00,0x00, - 6, // 0x48 'H' - 0x00,0x88,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00,0x00, + 6, // 0x48 'H' + 0x00,0x88,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00,0x00, - 6, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 6, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 6, // 0x4a 'J' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00, + 6, // 0x4a 'J' + 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00, - 6, // 0x4b 'K' - 0x00,0x88,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x88,0x00,0x00, + 6, // 0x4b 'K' + 0x00,0x88,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x88,0x00,0x00, - 6, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x00, + 6, // 0x4c 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x00, - 6, // 0x4d 'M' - 0x00,0x88,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, + 6, // 0x4d 'M' + 0x00,0x88,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - 6, // 0x4e 'N' - 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x88,0x88,0x00,0x00, + 6, // 0x4e 'N' + 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x88,0x88,0x00,0x00, - 6, // 0x4f 'O' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, + 6, // 0x4f 'O' + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - 6, // 0x50 'P' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, + 6, // 0x50 'P' + 0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, - 6, // 0x51 'Q' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0xa8,0x90,0x68,0x00,0x00, + 6, // 0x51 'Q' + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0xa8,0x90,0x68,0x00,0x00, - 6, // 0x52 'R' - 0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0xa0,0x90,0x88,0x00,0x00, + 6, // 0x52 'R' + 0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0xa0,0x90,0x88,0x00,0x00, - 6, // 0x53 'S' - 0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00, + 6, // 0x53 'S' + 0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00, - 6, // 0x54 'T' - 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, + 6, // 0x54 'T' + 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - 6, // 0x55 'U' - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, + 6, // 0x55 'U' + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, + 6, // 0x56 'V' + 0x00,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, + 6, // 0x57 'W' + 0x00,0x88,0x88,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, - 6, // 0x58 'X' - 0x00,0x88,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x88,0x00,0x00, + 6, // 0x58 'X' + 0x00,0x88,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x88,0x00,0x00, - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00, + 6, // 0x59 'Y' + 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - 6, // 0x5a 'Z' - 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0xf8,0x00,0x00, + 6, // 0x5a 'Z' + 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0xf8,0x00,0x00, - 6, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, + 6, // 0x5b '[' + 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - 6, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, + 6, // 0x5c '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, - 6, // 0x5d ']' - 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, + 6, // 0x5d ']' + 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, - 6, // 0x5e '^' - 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x5e '^' + 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00, + 6, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00, - 6, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x88,0x08,0x78,0x88,0x88,0x78,0x00,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x70,0x88,0x08,0x78,0x88,0x88,0x78,0x00,0x00, - 6, // 0x62 'b' - 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0xf0,0x00,0x00, + 6, // 0x62 'b' + 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0xf0,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00, - 6, // 0x64 'd' - 0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00, + 6, // 0x64 'd' + 0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x70,0x88,0x88,0xf8,0x80,0x80,0x78,0x00,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x70,0x88,0x88,0xf8,0x80,0x80,0x78,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x20,0x20,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0xf0, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0xf0, - 6, // 0x68 'h' - 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x88,0x00,0x00, + 6, // 0x68 'h' + 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - 6, // 0x69 'i' - 0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 6, // 0x69 'i' + 0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 6, // 0x6a 'j' - 0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x90,0x60, + 6, // 0x6a 'j' + 0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x90,0x60, - 6, // 0x6b 'k' - 0x00,0x80,0x80,0x80,0x88,0x90,0xa0,0xd0,0x88,0x88,0x00,0x00, + 6, // 0x6b 'k' + 0x00,0x80,0x80,0x80,0x88,0x90,0xa0,0xd0,0x88,0x88,0x00,0x00, - 6, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 6, // 0x6c 'l' + 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 6, // 0x6d 'm' - 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x00,0x00, + 6, // 0x6d 'm' + 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x00,0x00, - 6, // 0x6e 'n' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, + 6, // 0x6e 'n' + 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - 6, // 0x6f 'o' - 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, + 6, // 0x6f 'o' + 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0x80,0x80,0x80, + 6, // 0x70 'p' + 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0x80,0x80,0x80, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x08, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x08, - 6, // 0x72 'r' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x80,0x80,0x80,0x80,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0xb0,0xc8,0x88,0x80,0x80,0x80,0x80,0x00,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00, - 6, // 0x74 't' - 0x00,0x40,0x40,0x40,0xe0,0x40,0x40,0x40,0x48,0x30,0x00,0x00, + 6, // 0x74 't' + 0x00,0x40,0x40,0x40,0xe0,0x40,0x40,0x40,0x48,0x30,0x00,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x78,0x00,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x78,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, + 6, // 0x77 'w' + 0x00,0x00,0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x78,0x08,0x10,0xe0, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x78,0x08,0x10,0xe0, - 6, // 0x7a 'z' - 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, + 6, // 0x7a 'z' + 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, - 6, // 0x7b '{' - 0x18,0x20,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x20,0x18,0x00, + 6, // 0x7b '{' + 0x18,0x20,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x20,0x18,0x00, - 6, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, + 6, // 0x7c '|' + 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, - 6, // 0x7d '}' - 0xc0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xc0,0x00, + 6, // 0x7d '}' + 0xc0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xc0,0x00, - 6, // 0x7e '~' - 0x00,0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x7e '~' + 0x00,0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x7f '' - 0x00,0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00,0x00,0x00, - 0 - }; + 6, // 0x7f '' + 0x00,0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00,0x00,0x00, + 0 +}; - const int8u gse6x9[] = - { - 9, 0, 32, 128-32, +const int8u gse6x9[] = +{ + 9, 0, 32, 128-32, - 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, - 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, - 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, - 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, - 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, - 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, - 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, - 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, - 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, - 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, - 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, + 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, + 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, + 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, + 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, + 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, + 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, + 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, + 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, + 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, + 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, + 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, + 6, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - 6, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x22 '"' + 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, + 6, // 0x23 '#' + 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, - 6, // 0x24 '$' - 0x00,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x00, + 6, // 0x24 '$' + 0x00,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x00, - 6, // 0x25 '%' - 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, + 6, // 0x25 '%' + 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, - 6, // 0x26 '&' - 0x00,0x60,0x90,0x90,0x60,0xa8,0x90,0x68,0x00, + 6, // 0x26 '&' + 0x00,0x60,0x90,0x90,0x60,0xa8,0x90,0x68,0x00, - 6, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x27 ''' + 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, + 6, // 0x28 '(' + 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - 6, // 0x29 ')' - 0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40, + 6, // 0x29 ')' + 0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40, - 6, // 0x2a '*' - 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, + 6, // 0x2a '*' + 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, - 6, // 0x2b '+' - 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, + 6, // 0x2b '+' + 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, - 6, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, + 6, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, - 6, // 0x2d '-' - 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00, + 6, // 0x2d '-' + 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00, - 6, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, + 6, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - 6, // 0x2f '/' - 0x00,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0x00, + 6, // 0x2f '/' + 0x00,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0x00, - 6, // 0x30 '0' - 0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,0x00, + 6, // 0x30 '0' + 0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,0x00, - 6, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, + 6, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - 6, // 0x32 '2' - 0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x00, + 6, // 0x32 '2' + 0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x00, - 6, // 0x33 '3' - 0x00,0xf8,0x10,0x20,0x70,0x08,0x88,0x70,0x00, + 6, // 0x33 '3' + 0x00,0xf8,0x10,0x20,0x70,0x08,0x88,0x70,0x00, - 6, // 0x34 '4' - 0x00,0x10,0x20,0x40,0x90,0xf8,0x10,0x10,0x00, + 6, // 0x34 '4' + 0x00,0x10,0x20,0x40,0x90,0xf8,0x10,0x10,0x00, - 6, // 0x35 '5' - 0x00,0xf8,0x80,0xf0,0x08,0x08,0x88,0x70,0x00, + 6, // 0x35 '5' + 0x00,0xf8,0x80,0xf0,0x08,0x08,0x88,0x70,0x00, - 6, // 0x36 '6' - 0x00,0x70,0x88,0x80,0xf0,0x88,0x88,0x70,0x00, + 6, // 0x36 '6' + 0x00,0x70,0x88,0x80,0xf0,0x88,0x88,0x70,0x00, - 6, // 0x37 '7' - 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x40,0x00, + 6, // 0x37 '7' + 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x40,0x00, - 6, // 0x38 '8' - 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00, + 6, // 0x38 '8' + 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00, - 6, // 0x39 '9' - 0x00,0x70,0x88,0x88,0x78,0x08,0x88,0x70,0x00, + 6, // 0x39 '9' + 0x00,0x70,0x88,0x88,0x78,0x08,0x88,0x70,0x00, - 6, // 0x3a ':' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, + 6, // 0x3a ':' + 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, - 6, // 0x3b ';' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, + 6, // 0x3b ';' + 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, - 6, // 0x3c '<' - 0x00,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00, + 6, // 0x3c '<' + 0x00,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00, - 6, // 0x3d '=' - 0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00, + 6, // 0x3d '=' + 0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00, - 6, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, + 6, // 0x3e '>' + 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, - 6, // 0x3f '?' - 0x00,0x70,0x88,0x08,0x10,0x20,0x00,0x20,0x00, + 6, // 0x3f '?' + 0x00,0x70,0x88,0x08,0x10,0x20,0x00,0x20,0x00, - 6, // 0x40 '@' - 0x00,0x70,0x88,0x88,0xb8,0xb8,0x80,0x70,0x00, + 6, // 0x40 '@' + 0x00,0x70,0x88,0x88,0xb8,0xb8,0x80,0x70,0x00, - 6, // 0x41 'A' - 0x00,0x20,0x50,0x88,0x88,0xf8,0x88,0x88,0x00, + 6, // 0x41 'A' + 0x00,0x20,0x50,0x88,0x88,0xf8,0x88,0x88,0x00, - 6, // 0x42 'B' - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x00, + 6, // 0x42 'B' + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x00, - 6, // 0x43 'C' - 0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00, + 6, // 0x43 'C' + 0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00, - 6, // 0x44 'D' - 0x00,0xe0,0x90,0x88,0x88,0x88,0x90,0xe0,0x00, + 6, // 0x44 'D' + 0x00,0xe0,0x90,0x88,0x88,0x88,0x90,0xe0,0x00, - 6, // 0x45 'E' - 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x00, + 6, // 0x45 'E' + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x00, - 6, // 0x46 'F' - 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x00, + 6, // 0x46 'F' + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x00, - 6, // 0x47 'G' - 0x00,0x70,0x88,0x80,0xb8,0x88,0x88,0x70,0x00, + 6, // 0x47 'G' + 0x00,0x70,0x88,0x80,0xb8,0x88,0x88,0x70,0x00, - 6, // 0x48 'H' - 0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00, + 6, // 0x48 'H' + 0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00, - 6, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 6, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 6, // 0x4a 'J' - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00, + 6, // 0x4a 'J' + 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - 6, // 0x4b 'K' - 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x00, + 6, // 0x4b 'K' + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x00, - 6, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00, + 6, // 0x4c 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00, - 6, // 0x4d 'M' - 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x00, + 6, // 0x4d 'M' + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x00, - 6, // 0x4e 'N' - 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00, + 6, // 0x4e 'N' + 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00, - 6, // 0x4f 'O' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00, + 6, // 0x4f 'O' + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00, - 6, // 0x50 'P' - 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, + 6, // 0x50 'P' + 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, - 6, // 0x51 'Q' - 0x00,0x70,0x88,0x88,0x88,0xa8,0x90,0x68,0x00, + 6, // 0x51 'Q' + 0x00,0x70,0x88,0x88,0x88,0xa8,0x90,0x68,0x00, - 6, // 0x52 'R' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x90,0x88,0x00, + 6, // 0x52 'R' + 0x00,0xf0,0x88,0x88,0x88,0xf0,0x90,0x88,0x00, - 6, // 0x53 'S' - 0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00, + 6, // 0x53 'S' + 0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00, - 6, // 0x54 'T' - 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 6, // 0x54 'T' + 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 6, // 0x55 'U' - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00, + 6, // 0x55 'U' + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00, - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, + 6, // 0x56 'V' + 0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00, + 6, // 0x57 'W' + 0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00, - 6, // 0x58 'X' - 0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00, + 6, // 0x58 'X' + 0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00, - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, + 6, // 0x59 'Y' + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, - 6, // 0x5a 'Z' - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00, + 6, // 0x5a 'Z' + 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00, - 6, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, + 6, // 0x5b '[' + 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - 6, // 0x5c '\' - 0x00,0x80,0x80,0x40,0x20,0x10,0x08,0x08,0x00, + 6, // 0x5c '\' + 0x00,0x80,0x80,0x40,0x20,0x10,0x08,0x08,0x00, - 6, // 0x5d ']' - 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, + 6, // 0x5d ']' + 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - 6, // 0x5e '^' - 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00, + 6, // 0x5e '^' + 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00, - 6, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, + 6, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - 6, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00, - 6, // 0x62 'b' - 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x00, + 6, // 0x62 'b' + 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00, - 6, // 0x64 'd' - 0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00, + 6, // 0x64 'd' + 0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x70,0x88,0xf8,0x80,0x78,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x70,0x88,0xf8,0x80,0x78,0x00, - 6, // 0x66 'f' - 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x00, + 6, // 0x66 'f' + 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x70, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x70, - 6, // 0x68 'h' - 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x00, + 6, // 0x68 'h' + 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x00, - 6, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, + 6, // 0x69 'i' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, - 6, // 0x6a 'j' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x90,0x60, + 6, // 0x6a 'j' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x90,0x60, - 6, // 0x6b 'k' - 0x00,0x00,0x80,0x88,0x90,0xa0,0xd0,0x88,0x00, + 6, // 0x6b 'k' + 0x00,0x00,0x80,0x88,0x90,0xa0,0xd0,0x88,0x00, - 6, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 6, // 0x6c 'l' + 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 6, // 0x6d 'm' - 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x00, + 6, // 0x6d 'm' + 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x00, - 6, // 0x6e 'n' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x00, + 6, // 0x6e 'n' + 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x00, - 6, // 0x6f 'o' - 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00, + 6, // 0x6f 'o' + 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80, + 6, // 0x70 'p' + 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x08, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x08, - 6, // 0x72 'r' - 0x00,0x00,0x00,0xb8,0xc0,0x80,0x80,0x80,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0xb8,0xc0,0x80,0x80,0x80,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x00, - 6, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x48,0x30,0x00, + 6, // 0x74 't' + 0x00,0x40,0x40,0xe0,0x40,0x40,0x48,0x30,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00, - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0xa8,0xd8,0x88,0x00, + 6, // 0x77 'w' + 0x00,0x00,0x00,0x88,0x88,0xa8,0xd8,0x88,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x70, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x70, - 6, // 0x7a 'z' - 0x00,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x00, + 6, // 0x7a 'z' + 0x00,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x00, - 6, // 0x7b '{' - 0x18,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x18, + 6, // 0x7b '{' + 0x18,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x18, - 6, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, + 6, // 0x7c '|' + 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, - 6, // 0x7d '}' - 0xc0,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0xc0, + 6, // 0x7d '}' + 0xc0,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0xc0, - 6, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, + 6, // 0x7e '~' + 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, - 6, // 0x7f '' - 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, - 0 - }; + 6, // 0x7f '' + 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, + 0 +}; - const int8u gse7x11[] = - { - 11, 0, 32, 128-32, +const int8u gse7x11[] = +{ + 11, 0, 32, 128-32, - 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, - 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, - 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, - 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, - 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, - 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, - 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, + 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, + 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, + 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, + 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, + 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, + 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, + 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, + 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, + 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, + 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, + 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x21 '!' - 0x00,0x10,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x00,0x00, + 7, // 0x21 '!' + 0x00,0x10,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, + 7, // 0x23 '#' + 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, - 7, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, + 7, // 0x24 '$' + 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - 7, // 0x25 '%' - 0x00,0x00,0x42,0xa4,0x48,0x10,0x24,0x4a,0x84,0x00,0x00, + 7, // 0x25 '%' + 0x00,0x00,0x42,0xa4,0x48,0x10,0x24,0x4a,0x84,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x6c,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x6c,0x00,0x00, - 7, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x27 ''' + 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x08,0x04,0x00,0x00, + 7, // 0x28 '(' + 0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x08,0x04,0x00,0x00, - 7, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, + 7, // 0x29 ')' + 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, - 7, // 0x2a '*' - 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, + 7, // 0x2a '*' + 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, - 7, // 0x2b '+' - 0x00,0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00,0x00, + 7, // 0x2b '+' + 0x00,0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00,0x00, - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60, + 7, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60, - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, + 7, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - 7, // 0x2f '/' - 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, + 7, // 0x2f '/' + 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x44,0x38,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x44,0x38,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x7c,0x48,0x10,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x7c,0x48,0x10,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x08,0x10,0x20,0x48,0x48,0x7c,0x08,0x1c,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x08,0x10,0x20,0x48,0x48,0x7c,0x08,0x1c,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x7c,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x7c,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x7c,0x44,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x7c,0x44,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00,0x00, - 7, // 0x3a ':' - 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 7, // 0x3a ':' + 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00, - 7, // 0x3b ';' - 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x30,0x60,0x00, + 7, // 0x3b ';' + 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x30,0x60,0x00, - 7, // 0x3c '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00,0x00, + 7, // 0x3c '<' + 0x00,0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00,0x00, - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, + 7, // 0x3d '=' + 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, - 7, // 0x3e '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00,0x00, + 7, // 0x3e '>' + 0x00,0x00,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00,0x00, - 7, // 0x3f '?' - 0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, + 7, // 0x3f '?' + 0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x28,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x28,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x10,0x28,0x44,0x44,0x7c,0x44,0x44,0x44,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x10,0x28,0x44,0x44,0x7c,0x44,0x44,0x44,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 7, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x7c,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x7c,0x00,0x00, - 7, // 0x46 'F' - 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,0x00, + 7, // 0x46 'F' + 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5c,0x44,0x44,0x38,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x5c,0x44,0x44,0x38,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x49 'I' + 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x4a 'J' - 0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00, + 7, // 0x4a 'J' + 0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00, - 7, // 0x4b 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, + 7, // 0x4b 'K' + 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - 7, // 0x4c 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00, + 7, // 0x4c 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00, - 7, // 0x4d 'M' - 0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x4d 'M' + 0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x4e 'N' - 0x00,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x00,0x00, + 7, // 0x4e 'N' + 0x00,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x00,0x00, - 7, // 0x4f 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x4f 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, + 7, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, + 7, // 0x57 'W' + 0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x5a 'Z' - 0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00, + 7, // 0x5a 'Z' + 0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00, - 7, // 0x5b '[' - 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, + 7, // 0x5b '[' + 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, - 7, // 0x5c '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, + 7, // 0x5c '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, - 7, // 0x5d ']' - 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, + 7, // 0x5d ']' + 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, - 7, // 0x5e '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5e '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, + 7, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3c,0x44,0x44,0x3c,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3c,0x44,0x44,0x3c,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x3c,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x3c,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7c,0x40,0x44,0x38,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x7c,0x40,0x44,0x38,0x00,0x00, - 7, // 0x66 'f' - 0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x70,0x00,0x00, + 7, // 0x66 'f' + 0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x70,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x3c,0x04,0x44,0x38, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x3c,0x04,0x44,0x38, - 7, // 0x68 'h' - 0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x00,0x00, - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x69 'i' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x6a 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30,0x00, + 7, // 0x6a 'j' + 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30,0x00, - 7, // 0x6b 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x68,0x44,0x44,0x00,0x00, + 7, // 0x6b 'k' + 0x00,0x40,0x40,0x44,0x48,0x50,0x68,0x44,0x44,0x00,0x00, - 7, // 0x6c 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x6c 'l' + 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x6d 'm' - 0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x00,0x00, + 7, // 0x6d 'm' + 0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x00,0x00, - 7, // 0x6e 'n' - 0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x6e 'n' + 0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x6f 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x3c,0x04,0x04, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x3c,0x04,0x04, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x3c,0x40,0x38,0x04,0x04,0x78,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x3c,0x40,0x38,0x04,0x04,0x78,0x00,0x00, - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00, + 7, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00, - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x7c,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, + 7, // 0x7a 'z' + 0x00,0x00,0x00,0x7c,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, - 7, // 0x7b '{' - 0x00,0x0c,0x10,0x10,0x10,0x60,0x10,0x10,0x0c,0x00,0x00, + 7, // 0x7b '{' + 0x00,0x0c,0x10,0x10,0x10,0x60,0x10,0x10,0x0c,0x00,0x00, - 7, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, + 7, // 0x7c '|' + 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, - 7, // 0x7d '}' - 0x00,0x60,0x10,0x10,0x10,0x0c,0x10,0x10,0x60,0x00,0x00, + 7, // 0x7d '}' + 0x00,0x60,0x10,0x10,0x10,0x0c,0x10,0x10,0x60,0x00,0x00, - 7, // 0x7e '~' - 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7e '~' + 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7f '' - 0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00, - 0 - }; + 7, // 0x7f '' + 0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00, + 0 +}; - const int8u gse7x11_bold[] = - { - 11, 0, 32, 128-32, +const int8u gse7x11_bold[] = +{ + 11, 0, 32, 128-32, - 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, - 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, - 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, - 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, - 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, - 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, - 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, + 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, + 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, + 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, + 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, + 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, + 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, + 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, + 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, + 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, + 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, + 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x21 '!' - 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00, + 7, // 0x21 '!' + 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, + 7, // 0x23 '#' + 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, - 7, // 0x24 '$' - 0x30,0x30,0x78,0xcc,0xc0,0x78,0x0c,0xcc,0x78,0x30,0x30, + 7, // 0x24 '$' + 0x30,0x30,0x78,0xcc,0xc0,0x78,0x0c,0xcc,0x78,0x30,0x30, - 7, // 0x25 '%' - 0x00,0x00,0xc4,0x0c,0x18,0x30,0x60,0xc0,0x8c,0x00,0x00, + 7, // 0x25 '%' + 0x00,0x00,0xc4,0x0c,0x18,0x30,0x60,0xc0,0x8c,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0x6c,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0x6c,0x00,0x00, - 7, // 0x27 ''' - 0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x27 ''' + 0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00, + 7, // 0x28 '(' + 0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00, - 7, // 0x29 ')' - 0x00,0xc0,0x60,0x30,0x30,0x30,0x30,0x60,0xc0,0x00,0x00, + 7, // 0x29 ')' + 0x00,0xc0,0x60,0x30,0x30,0x30,0x30,0x60,0xc0,0x00,0x00, - 7, // 0x2a '*' - 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, + 7, // 0x2a '*' + 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, - 7, // 0x2b '+' - 0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00, + 7, // 0x2b '+' + 0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00, - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00, + 7, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00, - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, + 7, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - 7, // 0x2f '/' - 0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00, + 7, // 0x2f '/' + 0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x78,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x78,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0xfc,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0xfc,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x78,0xcc,0xcc,0x18,0x30,0x60,0xcc,0xfc,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x78,0xcc,0xcc,0x18,0x30,0x60,0xcc,0xfc,0x00,0x00, - 7, // 0x33 '3' - 0x00,0xfc,0x98,0x30,0x78,0x0c,0x0c,0xcc,0x78,0x00,0x00, + 7, // 0x33 '3' + 0x00,0xfc,0x98,0x30,0x78,0x0c,0x0c,0xcc,0x78,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x18,0x30,0x68,0xd8,0xd8,0xfc,0x18,0x3c,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x18,0x30,0x68,0xd8,0xd8,0xfc,0x18,0x3c,0x00,0x00, - 7, // 0x35 '5' - 0x00,0xfc,0xc0,0xc0,0xf8,0x0c,0x0c,0xcc,0x78,0x00,0x00, + 7, // 0x35 '5' + 0x00,0xfc,0xc0,0xc0,0xf8,0x0c,0x0c,0xcc,0x78,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x38,0x60,0xc0,0xf8,0xcc,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x38,0x60,0xc0,0xf8,0xcc,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x37 '7' - 0x00,0xfc,0x8c,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00, + 7, // 0x37 '7' + 0x00,0xfc,0x8c,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x78,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x78,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x78,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0x70,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x78,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0x70,0x00,0x00, - 7, // 0x3a ':' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x3a ':' + 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x3b ';' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x60,0x00, + 7, // 0x3b ';' + 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - 7, // 0x3c '<' - 0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x00, + 7, // 0x3c '<' + 0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x00, - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, + 7, // 0x3d '=' + 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, - 7, // 0x3e '>' - 0x00,0x00,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0x00,0x00, + 7, // 0x3e '>' + 0x00,0x00,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0x00,0x00, - 7, // 0x3f '?' - 0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x00,0x30,0x00,0x00, + 7, // 0x3f '?' + 0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x00,0x30,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0x68,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0x68,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x30,0x78,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x30,0x78,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x42 'B' - 0x00,0xf8,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xf8,0x00,0x00, + 7, // 0x42 'B' + 0x00,0xf8,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xf8,0x00,0x00, - 7, // 0x43 'C' - 0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00, + 7, // 0x43 'C' + 0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00, - 7, // 0x44 'D' - 0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00, + 7, // 0x44 'D' + 0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00, - 7, // 0x45 'E' - 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc4,0xfc,0x00,0x00, + 7, // 0x45 'E' + 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc4,0xfc,0x00,0x00, - 7, // 0x46 'F' - 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0x00,0x00, + 7, // 0x46 'F' + 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x78,0xcc,0xc0,0xc0,0xdc,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x78,0xcc,0xc0,0xc0,0xdc,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x48 'H' - 0x00,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x48 'H' + 0x00,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x49 'I' - 0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, + 7, // 0x49 'I' + 0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - 7, // 0x4a 'J' - 0x00,0x3c,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00, + 7, // 0x4a 'J' + 0x00,0x3c,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00, - 7, // 0x4b 'K' - 0x00,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x4b 'K' + 0x00,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x4c 'L' - 0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00, + 7, // 0x4c 'L' + 0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00, - 7, // 0x4d 'M' - 0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x4d 'M' + 0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x4e 'N' - 0x00,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x4e 'N' + 0x00,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x4f 'O' - 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x4f 'O' + 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x50 'P' - 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00,0x00, + 7, // 0x50 'P' + 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00, + 7, // 0x51 'Q' + 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00, - 7, // 0x52 'R' - 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0x00,0x00, + 7, // 0x52 'R' + 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00, - 7, // 0x54 'T' - 0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, + 7, // 0x54 'T' + 0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - 7, // 0x55 'U' - 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x55 'U' + 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x56 'V' - 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, + 7, // 0x56 'V' + 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, - 7, // 0x57 'W' - 0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, + 7, // 0x57 'W' + 0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, - 7, // 0x58 'X' - 0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x58 'X' + 0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x78,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x78,0x00,0x00, - 7, // 0x5a 'Z' - 0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00, + 7, // 0x5a 'Z' + 0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00, - 7, // 0x5b '[' - 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, + 7, // 0x5b '[' + 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, - 7, // 0x5c '\' - 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00, + 7, // 0x5c '\' + 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00, - 7, // 0x5d ']' - 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, + 7, // 0x5d ']' + 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, - 7, // 0x5e '^' - 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5e '^' + 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, + 7, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, - 7, // 0x60 '`' - 0x00,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x18,0x78,0xd8,0xd8,0x6c,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x70,0x18,0x78,0xd8,0xd8,0x6c,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x78,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x78,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xcc,0x78,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xcc,0x78,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x78,0xcc,0xfc,0xc0,0xcc,0x78,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x78,0xcc,0xfc,0xc0,0xcc,0x78,0x00,0x00, - 7, // 0x66 'f' - 0x00,0x18,0x34,0x30,0x78,0x30,0x30,0x30,0x78,0x00,0x00, + 7, // 0x66 'f' + 0x00,0x18,0x34,0x30,0x78,0x30,0x30,0x30,0x78,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70, - 7, // 0x68 'h' - 0x00,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0x00,0x00, + 7, // 0x68 'h' + 0x00,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - 7, // 0x69 'i' - 0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, + 7, // 0x69 'i' + 0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - 7, // 0x6a 'j' - 0x00,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x6c,0x6c,0x38, + 7, // 0x6a 'j' + 0x00,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x6c,0x6c,0x38, - 7, // 0x6b 'k' - 0x00,0xc0,0xc0,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0x00,0x00, + 7, // 0x6b 'k' + 0x00,0xc0,0xc0,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0x00,0x00, - 7, // 0x6c 'l' - 0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, + 7, // 0x6c 'l' + 0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - 7, // 0x6d 'm' - 0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xc4,0xc4,0x00,0x00, + 7, // 0x6d 'm' + 0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xc4,0xc4,0x00,0x00, - 7, // 0x6e 'n' - 0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00, + 7, // 0x6e 'n' + 0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00, - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, + 7, // 0x6f 'o' + 0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0, + 7, // 0x70 'p' + 0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c, - 7, // 0x72 'r' - 0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x78,0xcc,0x60,0x18,0xcc,0x78,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x78,0xcc,0x60,0x18,0xcc,0x78,0x00,0x00, - 7, // 0x74 't' - 0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x68,0x30,0x00,0x00, + 7, // 0x74 't' + 0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x68,0x30,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0xcc,0x78,0x30,0x78,0xcc,0xcc,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0xcc,0x78,0x30,0x78,0xcc,0xcc,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0, + 7, // 0x79 'y' + 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0, - 7, // 0x7a 'z' - 0x00,0x00,0x00,0xfc,0x98,0x30,0x60,0xc4,0xfc,0x00,0x00, + 7, // 0x7a 'z' + 0x00,0x00,0x00,0xfc,0x98,0x30,0x60,0xc4,0xfc,0x00,0x00, - 7, // 0x7b '{' - 0x1c,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x1c,0x00,0x00, + 7, // 0x7b '{' + 0x1c,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x1c,0x00,0x00, - 7, // 0x7c '|' - 0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x30,0x30,0x00,0x00, + 7, // 0x7c '|' + 0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x30,0x30,0x00,0x00, - 7, // 0x7d '}' - 0xe0,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0xe0,0x00,0x00, + 7, // 0x7d '}' + 0xe0,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0xe0,0x00,0x00, - 7, // 0x7e '~' - 0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7e '~' + 0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7f '' - 0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00, - 0 - }; + 7, // 0x7f '' + 0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00, + 0 +}; - const int8u gse7x15[] = - { - 15, 0, 32, 128-32, +const int8u gse7x15[] = +{ + 15, 0, 32, 128-32, - 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, - 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, - 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, - 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, - 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, - 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, - 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, - 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, - 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, - 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, - 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, + 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, + 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, + 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, + 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, + 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, + 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, + 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, + 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, + 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, + 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, + 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x21 '!' - 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, + 7, // 0x21 '!' + 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, + 7, // 0x23 '#' + 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, - 7, // 0x24 '$' - 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x54,0x38,0x10,0x00,0x00,0x00, + 7, // 0x24 '$' + 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x54,0x38,0x10,0x00,0x00,0x00, - 7, // 0x25 '%' - 0x00,0x00,0x44,0x44,0x08,0x08,0x10,0x10,0x20,0x20,0x44,0x44,0x00,0x00,0x00, + 7, // 0x25 '%' + 0x00,0x00,0x44,0x44,0x08,0x08,0x10,0x10,0x20,0x20,0x44,0x44,0x00,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x90,0x6c,0x00,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x00,0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x90,0x6c,0x00,0x00,0x00, - 7, // 0x27 ''' - 0x00,0x00,0x20,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x27 ''' + 0x00,0x00,0x20,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x08,0x04,0x00,0x00,0x00, + 7, // 0x28 '(' + 0x00,0x04,0x08,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x08,0x04,0x00,0x00,0x00, - 7, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x40,0x00,0x00,0x00, + 7, // 0x29 ')' + 0x00,0x40,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x40,0x00,0x00,0x00, - 7, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2a '*' + 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x00,0x00,0x00,0x00, + 7, // 0x2b '+' + 0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x00,0x00,0x00,0x00, - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, + 7, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x2f '/' - 0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, + 7, // 0x2f '/' + 0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x00,0x38,0x44,0x44,0x4c,0x54,0x64,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x00,0x38,0x44,0x44,0x4c,0x54,0x64,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x00,0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x00,0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x00,0x7c,0x44,0x08,0x10,0x38,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x00,0x7c,0x44,0x08,0x10,0x38,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x00,0x08,0x10,0x20,0x40,0x48,0x48,0x7c,0x08,0x08,0x1c,0x00,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x00,0x08,0x10,0x20,0x40,0x48,0x48,0x7c,0x08,0x08,0x1c,0x00,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x78,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x00,0x7c,0x40,0x40,0x40,0x78,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x00,0x18,0x20,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x00,0x18,0x20,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x00,0x7c,0x44,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x00,0x7c,0x44,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x08,0x30,0x00,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x08,0x30,0x00,0x00,0x00, - 7, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, + 7, // 0x3a ':' + 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, - 7, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00, + 7, // 0x3b ';' + 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00, - 7, // 0x3c '<' - 0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00, + 7, // 0x3c '<' + 0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00, - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x3d '=' + 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3e '>' - 0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x00, + 7, // 0x3e '>' + 0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x00, - 7, // 0x3f '?' - 0x00,0x00,0x78,0x84,0x84,0x84,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00,0x00, + 7, // 0x3f '?' + 0x00,0x00,0x78,0x84,0x84,0x84,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x00,0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x54,0x28,0x00,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x00,0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x54,0x28,0x00,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x00,0x10,0x28,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x00,0x10,0x28,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - 7, // 0x43 'C' - 0x00,0x00,0x38,0x44,0x44,0x40,0x40,0x40,0x40,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x43 'C' + 0x00,0x00,0x38,0x44,0x44,0x40,0x40,0x40,0x40,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - 7, // 0x46 'F' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 7, // 0x46 'F' + 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x5c,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x5c,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x00,0x44,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x00,0x44,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x49 'I' - 0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x49 'I' + 0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x4a 'J' - 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, + 7, // 0x4a 'J' + 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - 7, // 0x4b 'K' - 0x00,0x00,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x4b 'K' + 0x00,0x00,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x4c 'L' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, + 7, // 0x4c 'L' + 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - 7, // 0x4d 'M' - 0x00,0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x4d 'M' + 0x00,0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x4e 'N' - 0x00,0x00,0x44,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x4e 'N' + 0x00,0x00,0x44,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x4f 'O' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x4f 'O' + 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x44,0x00,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x44,0x00,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x00,0x38,0x44,0x44,0x40,0x38,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x00,0x38,0x44,0x44,0x40,0x38,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x56 'V' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, + 7, // 0x56 'V' + 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - 7, // 0x57 'W' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, + 7, // 0x57 'W' + 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x5a 'Z' - 0x00,0x00,0x7c,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, + 7, // 0x5a 'Z' + 0x00,0x00,0x7c,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - 7, // 0x5b '[' - 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, + 7, // 0x5b '[' + 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, - 7, // 0x5c '\' - 0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00,0x00, + 7, // 0x5c '\' + 0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00,0x00, - 7, // 0x5d ']' - 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, + 7, // 0x5d ']' + 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, - 7, // 0x5e '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5e '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, + 7, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, - 7, // 0x60 '`' - 0x00,0x20,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x20,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x00,0x04,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x00,0x04,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x7c,0x40,0x40,0x44,0x38,0x00,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x7c,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x66 'f' - 0x00,0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 7, // 0x66 'f' + 0x00,0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x3a,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x3a,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, - 7, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x69 'i' - 0x00,0x00,0x10,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x69 'i' + 0x00,0x00,0x10,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x6a 'j' - 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00, + 7, // 0x6a 'j' + 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00, - 7, // 0x6b 'k' - 0x00,0x00,0x40,0x40,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, + 7, // 0x6b 'k' + 0x00,0x00,0x40,0x40,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - 7, // 0x6c 'l' - 0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x6c 'l' + 0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x00,0x00,0x00, + 7, // 0x6d 'm' + 0x00,0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x00,0x00,0x00, - 7, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x6e 'n' + 0x00,0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x6f 'o' + 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x04,0x00, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x04,0x00, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x74 't' - 0x00,0x00,0x20,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, + 7, // 0x74 't' + 0x00,0x00,0x20,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x08,0x70,0x00, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x08,0x70,0x00, - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x40,0x7c,0x00,0x00,0x00, + 7, // 0x7a 'z' + 0x00,0x00,0x00,0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x40,0x7c,0x00,0x00,0x00, - 7, // 0x7b '{' - 0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0c,0x00,0x00, + 7, // 0x7b '{' + 0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0c,0x00,0x00, - 7, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00, + 7, // 0x7c '|' + 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - 7, // 0x7d '}' - 0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x0c,0x10,0x10,0x10,0x10,0x60,0x00,0x00, + 7, // 0x7d '}' + 0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x0c,0x10,0x10,0x10,0x10,0x60,0x00,0x00, - 7, // 0x7e '~' - 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7e '~' + 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 7, // 0x7f '' + 0x00,0x00,0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00,0x00,0x00, + 0 +}; - const int8u gse7x15_bold[] = - { - 15, 0, 32, 128-32, +const int8u gse7x15_bold[] = +{ + 15, 0, 32, 128-32, - 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, - 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, - 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, - 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, - 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, - 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, - 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, - 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, - 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, - 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, - 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, + 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, + 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, + 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, + 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, + 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, + 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, + 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, + 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, + 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, + 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, + 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x21 '!' - 0x00,0x00,0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x21 '!' + 0x00,0x00,0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x6c,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x6c,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, + 7, // 0x23 '#' + 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, - 7, // 0x24 '$' - 0x00,0x30,0x30,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x30,0x30,0x00,0x00, + 7, // 0x24 '$' + 0x00,0x30,0x30,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x30,0x30,0x00,0x00, - 7, // 0x25 '%' - 0x00,0x00,0x00,0x64,0x6c,0x08,0x18,0x10,0x30,0x20,0x6c,0x4c,0x00,0x00,0x00, + 7, // 0x25 '%' + 0x00,0x00,0x00,0x64,0x6c,0x08,0x18,0x10,0x30,0x20,0x6c,0x4c,0x00,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0xd8,0x6c,0x00,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x00,0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0xd8,0x6c,0x00,0x00,0x00, - 7, // 0x27 ''' - 0x00,0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x27 ''' + 0x00,0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x0c,0x18,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, + 7, // 0x28 '(' + 0x00,0x0c,0x18,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, - 7, // 0x29 ')' - 0x00,0xc0,0x60,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, + 7, // 0x29 ')' + 0x00,0xc0,0x60,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, - 7, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2a '*' + 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2b '+' + 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, + 7, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x2f '/' - 0x00,0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0xc0,0xc0,0x00,0x00,0x00, + 7, // 0x2f '/' + 0x00,0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0xc0,0xc0,0x00,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x00,0x30,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0x30,0xfc,0x00,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x00,0x30,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0x30,0xfc,0x00,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x00,0x78,0xcc,0xcc,0x0c,0x18,0x30,0x60,0xc0,0xcc,0xfc,0x00,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x00,0x78,0xcc,0xcc,0x0c,0x18,0x30,0x60,0xc0,0xcc,0xfc,0x00,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x00,0xfc,0x8c,0x18,0x30,0x78,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x00,0xfc,0x8c,0x18,0x30,0x78,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x00,0x18,0x30,0x60,0xc8,0xd8,0xd8,0xfc,0x18,0x18,0x3c,0x00,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x00,0x18,0x30,0x60,0xc8,0xd8,0xd8,0xfc,0x18,0x18,0x3c,0x00,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x00,0xfc,0xc0,0xc0,0xc0,0xf8,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x00,0xfc,0xc0,0xc0,0xc0,0xf8,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x00,0x38,0x60,0xc0,0xc0,0xf8,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x00,0x38,0x60,0xc0,0xc0,0xf8,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x00,0xfc,0x8c,0x0c,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x00,0xfc,0x8c,0x0c,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x00,0x78,0xcc,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x18,0x70,0x00,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x18,0x70,0x00,0x00,0x00, - 7, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00, + 7, // 0x3a ':' + 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00, - 7, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, + 7, // 0x3b ';' + 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - 7, // 0x3c '<' - 0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0xc0,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, + 7, // 0x3c '<' + 0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0xc0,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x3d '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3e '>' - 0x00,0x00,0x00,0xc0,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, + 7, // 0x3e '>' + 0x00,0x00,0x00,0xc0,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, - 7, // 0x3f '?' - 0x00,0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x3f '?' + 0x00,0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x00,0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0xb4,0x68,0x00,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x00,0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0xb4,0x68,0x00,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x00,0x30,0x78,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x00,0x30,0x78,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0x00,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0x00,0x00,0x00, - 7, // 0x43 'C' - 0x00,0x00,0x78,0xcc,0xc4,0xc0,0xc0,0xc0,0xc0,0xc4,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x43 'C' + 0x00,0x00,0x78,0xcc,0xc4,0xc0,0xc0,0xc0,0xc0,0xc4,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - 7, // 0x46 'F' - 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, + 7, // 0x46 'F' + 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xdc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xdc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x49 'I' - 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, + 7, // 0x49 'I' + 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - 7, // 0x4a 'J' - 0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00,0x00, + 7, // 0x4a 'J' + 0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00,0x00, - 7, // 0x4b 'K' - 0x00,0x00,0xcc,0xcc,0xd8,0xd8,0xf0,0xd8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x4b 'K' + 0x00,0x00,0xcc,0xcc,0xd8,0xd8,0xf0,0xd8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x4c 'L' - 0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, + 7, // 0x4c 'L' + 0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - 7, // 0x4d 'M' - 0x00,0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x4d 'M' + 0x00,0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x4e 'N' - 0x00,0x00,0xcc,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x4e 'N' + 0x00,0x00,0xcc,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x4f 'O' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x4f 'O' + 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x00,0x78,0xcc,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x00,0x78,0xcc,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x56 'V' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, + 7, // 0x56 'V' + 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, - 7, // 0x57 'W' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, + 7, // 0x57 'W' + 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x00,0xcc,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x00,0xcc,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - 7, // 0x5a 'Z' - 0x00,0x00,0xfc,0x8c,0x0c,0x18,0x30,0x60,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, + 7, // 0x5a 'Z' + 0x00,0x00,0xfc,0x8c,0x0c,0x18,0x30,0x60,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - 7, // 0x5b '[' - 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, + 7, // 0x5b '[' + 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, - 7, // 0x5c '\' - 0x00,0x00,0xc0,0xc0,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00,0x00, + 7, // 0x5c '\' + 0x00,0x00,0xc0,0xc0,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00,0x00, - 7, // 0x5d ']' - 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, + 7, // 0x5d ']' + 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, - 7, // 0x5e '^' - 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5e '^' + 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, + 7, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, - 7, // 0x60 '`' - 0x00,0x30,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x30,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x70,0xd8,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x70,0xd8,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x6c,0x6c,0x78,0x00,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x6c,0x6c,0x78,0x00,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xfc,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xfc,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x66 'f' - 0x00,0x00,0x30,0x68,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, + 7, // 0x66 'f' + 0x00,0x00,0x30,0x68,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70,0x00, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70,0x00, - 7, // 0x68 'h' - 0x00,0x00,0xc0,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x00,0xc0,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x69 'i' - 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, + 7, // 0x69 'i' + 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - 7, // 0x6a 'j' - 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00, + 7, // 0x6a 'j' + 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00, - 7, // 0x6b 'k' - 0x00,0x00,0xc0,0xc0,0xcc,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x6b 'k' + 0x00,0x00,0xc0,0xc0,0xcc,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x6c 'l' - 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, + 7, // 0x6c 'l' + 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - 7, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xd4,0xc4,0xc4,0xc4,0x00,0x00,0x00, + 7, // 0x6d 'm' + 0x00,0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xd4,0xc4,0xc4,0xc4,0x00,0x00,0x00, - 7, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00, + 7, // 0x6e 'n' + 0x00,0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00, - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x6f 'o' + 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c,0x00, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c,0x00, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00,0x00, - 7, // 0x74 't' - 0x00,0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0x6c,0x38,0x00,0x00,0x00, + 7, // 0x74 't' + 0x00,0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0x6c,0x38,0x00,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0,0x00, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0,0x00, - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00,0x00, + 7, // 0x7a 'z' + 0x00,0x00,0x00,0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00,0x00, - 7, // 0x7b '{' - 0x00,0x1c,0x30,0x30,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x30,0x1c,0x00,0x00, + 7, // 0x7b '{' + 0x00,0x1c,0x30,0x30,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x30,0x1c,0x00,0x00, - 7, // 0x7c '|' - 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00, + 7, // 0x7c '|' + 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - 7, // 0x7d '}' - 0x00,0xe0,0x30,0x30,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0x30,0xe0,0x00,0x00, + 7, // 0x7d '}' + 0x00,0xe0,0x30,0x30,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0x30,0xe0,0x00,0x00, - 7, // 0x7e '~' - 0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7e '~' + 0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 7, // 0x7f '' + 0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00,0x00,0x00, + 0 +}; - const int8u gse8x16[] = - { - 16, 0, 32, 128-32, +const int8u gse8x16[] = +{ + 16, 0, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, - 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, - 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, - 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, - 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, - 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, - 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, - 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, - 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, - 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, - 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, + 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, + 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, + 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, + 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, + 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, + 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, + 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, + 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, + 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, + 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, + 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, - 8, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x21 '!' - 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00,0x00, + 8, // 0x21 '!' + 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00,0x00, - 8, // 0x22 '"' - 0x00,0x24,0x24,0x24,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x22 '"' + 0x00,0x24,0x24,0x24,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x23 '#' - 0x00,0x00,0x24,0x24,0x24,0x7e,0x24,0x24,0x7e,0x24,0x24,0x24,0x00,0x00,0x00,0x00, + 8, // 0x23 '#' + 0x00,0x00,0x24,0x24,0x24,0x7e,0x24,0x24,0x7e,0x24,0x24,0x24,0x00,0x00,0x00,0x00, - 8, // 0x24 '$' - 0x00,0x14,0x14,0x3e,0x55,0x54,0x54,0x3e,0x15,0x15,0x55,0x3e,0x14,0x14,0x00,0x00, + 8, // 0x24 '$' + 0x00,0x14,0x14,0x3e,0x55,0x54,0x54,0x3e,0x15,0x15,0x55,0x3e,0x14,0x14,0x00,0x00, - 8, // 0x25 '%' - 0x00,0x00,0x32,0x56,0x6c,0x04,0x08,0x08,0x10,0x13,0x25,0x26,0x00,0x00,0x00,0x00, + 8, // 0x25 '%' + 0x00,0x00,0x32,0x56,0x6c,0x04,0x08,0x08,0x10,0x13,0x25,0x26,0x00,0x00,0x00,0x00, - 8, // 0x26 '&' - 0x00,0x00,0x18,0x24,0x24,0x24,0x18,0x28,0x45,0x46,0x44,0x3b,0x00,0x00,0x00,0x00, + 8, // 0x26 '&' + 0x00,0x00,0x18,0x24,0x24,0x24,0x18,0x28,0x45,0x46,0x44,0x3b,0x00,0x00,0x00,0x00, - 8, // 0x27 ''' - 0x00,0x00,0x08,0x08,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x27 ''' + 0x00,0x00,0x08,0x08,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x04,0x00,0x00,0x00, + 8, // 0x28 '(' + 0x00,0x04,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x04,0x00,0x00,0x00, - 8, // 0x29 ')' - 0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x02,0x04,0x04,0x08,0x10,0x00,0x00,0x00, + 8, // 0x29 ')' + 0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x02,0x04,0x04,0x08,0x10,0x00,0x00,0x00, - 8, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2a '*' + 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x7f,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2b '+' + 0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x7f,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, + 8, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, - 8, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, + 8, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - 8, // 0x2f '/' - 0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, + 8, // 0x2f '/' + 0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, - 8, // 0x30 '0' - 0x00,0x00,0x3c,0x42,0x42,0x46,0x4a,0x52,0x62,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x30 '0' + 0x00,0x00,0x3c,0x42,0x42,0x46,0x4a,0x52,0x62,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x31 '1' - 0x00,0x00,0x08,0x08,0x18,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x31 '1' + 0x00,0x00,0x08,0x08,0x18,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x32 '2' - 0x00,0x00,0x3c,0x42,0x42,0x02,0x04,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, + 8, // 0x32 '2' + 0x00,0x00,0x3c,0x42,0x42,0x02,0x04,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, - 8, // 0x33 '3' - 0x00,0x00,0x7e,0x42,0x04,0x08,0x1c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x33 '3' + 0x00,0x00,0x7e,0x42,0x04,0x08,0x1c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x34 '4' - 0x00,0x00,0x04,0x08,0x10,0x24,0x44,0x44,0x7e,0x04,0x04,0x0e,0x00,0x00,0x00,0x00, + 8, // 0x34 '4' + 0x00,0x00,0x04,0x08,0x10,0x24,0x44,0x44,0x7e,0x04,0x04,0x0e,0x00,0x00,0x00,0x00, - 8, // 0x35 '5' - 0x00,0x00,0x7e,0x42,0x40,0x40,0x7c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x35 '5' + 0x00,0x00,0x7e,0x42,0x40,0x40,0x7c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x36 '6' - 0x00,0x00,0x1c,0x20,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x36 '6' + 0x00,0x00,0x1c,0x20,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x37 '7' - 0x00,0x00,0x7e,0x42,0x42,0x02,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, + 8, // 0x37 '7' + 0x00,0x00,0x7e,0x42,0x42,0x02,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, - 8, // 0x38 '8' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x38 '8' + 0x00,0x00,0x3c,0x42,0x42,0x42,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x39 '9' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x04,0x38,0x00,0x00,0x00,0x00, + 8, // 0x39 '9' + 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x04,0x38,0x00,0x00,0x00,0x00, - 8, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x3a ':' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, + 8, // 0x3b ';' + 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, - 8, // 0x3c '<' - 0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00, + 8, // 0x3c '<' + 0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00, - 8, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x3d '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3e '>' - 0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00, + 8, // 0x3e '>' + 0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00, - 8, // 0x3f '?' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x04,0x08,0x08,0x00,0x08,0x08,0x00,0x00,0x00,0x00, + 8, // 0x3f '?' + 0x00,0x00,0x3c,0x42,0x42,0x42,0x04,0x08,0x08,0x00,0x08,0x08,0x00,0x00,0x00,0x00, - 8, // 0x40 '@' - 0x00,0x00,0x3c,0x42,0x01,0x39,0x49,0x49,0x49,0x49,0x49,0x36,0x00,0x00,0x00,0x00, + 8, // 0x40 '@' + 0x00,0x00,0x3c,0x42,0x01,0x39,0x49,0x49,0x49,0x49,0x49,0x36,0x00,0x00,0x00,0x00, - 8, // 0x41 'A' - 0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, + 8, // 0x41 'A' + 0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - 8, // 0x42 'B' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x3c,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, + 8, // 0x42 'B' + 0x00,0x00,0x7c,0x22,0x22,0x22,0x3c,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, - 8, // 0x43 'C' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x40,0x40,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x43 'C' + 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x40,0x40,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x44 'D' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, + 8, // 0x44 'D' + 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, - 8, // 0x45 'E' - 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, + 8, // 0x45 'E' + 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, - 8, // 0x46 'F' - 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, + 8, // 0x46 'F' + 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - 8, // 0x47 'G' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x4e,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x47 'G' + 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x4e,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x48 'H' - 0x00,0x00,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, + 8, // 0x48 'H' + 0x00,0x00,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - 8, // 0x49 'I' - 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, + 8, // 0x49 'I' + 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - 8, // 0x4a 'J' - 0x00,0x00,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00,0x00, + 8, // 0x4a 'J' + 0x00,0x00,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00,0x00, - 8, // 0x4b 'K' - 0x00,0x00,0x62,0x22,0x24,0x28,0x30,0x28,0x24,0x22,0x22,0x62,0x00,0x00,0x00,0x00, + 8, // 0x4b 'K' + 0x00,0x00,0x62,0x22,0x24,0x28,0x30,0x28,0x24,0x22,0x22,0x62,0x00,0x00,0x00,0x00, - 8, // 0x4c 'L' - 0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, + 8, // 0x4c 'L' + 0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, - 8, // 0x4d 'M' - 0x00,0x00,0x41,0x63,0x55,0x49,0x41,0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x00,0x00, + 8, // 0x4d 'M' + 0x00,0x00,0x41,0x63,0x55,0x49,0x41,0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x00,0x00, - 8, // 0x4e 'N' - 0x00,0x00,0x42,0x42,0x62,0x52,0x4a,0x46,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, + 8, // 0x4e 'N' + 0x00,0x00,0x42,0x42,0x62,0x52,0x4a,0x46,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - 8, // 0x4f 'O' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x4f 'O' + 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x50 'P' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, + 8, // 0x50 'P' + 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - 8, // 0x51 'Q' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x4a,0x44,0x3a,0x02,0x00,0x00,0x00, + 8, // 0x51 'Q' + 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x4a,0x44,0x3a,0x02,0x00,0x00,0x00, - 8, // 0x52 'R' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x28,0x24,0x22,0x62,0x00,0x00,0x00,0x00, + 8, // 0x52 'R' + 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x28,0x24,0x22,0x62,0x00,0x00,0x00,0x00, - 8, // 0x53 'S' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x30,0x0c,0x02,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x53 'S' + 0x00,0x00,0x3c,0x42,0x42,0x40,0x30,0x0c,0x02,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x54 'T' - 0x00,0x00,0x7f,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, + 8, // 0x54 'T' + 0x00,0x00,0x7f,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - 8, // 0x55 'U' - 0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x55 'U' + 0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x56 'V' - 0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x22,0x14,0x14,0x08,0x08,0x00,0x00,0x00,0x00, + 8, // 0x56 'V' + 0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x22,0x14,0x14,0x08,0x08,0x00,0x00,0x00,0x00, - 8, // 0x57 'W' - 0x00,0x00,0x41,0x41,0x41,0x41,0x41,0x49,0x49,0x55,0x63,0x41,0x00,0x00,0x00,0x00, + 8, // 0x57 'W' + 0x00,0x00,0x41,0x41,0x41,0x41,0x41,0x49,0x49,0x55,0x63,0x41,0x00,0x00,0x00,0x00, - 8, // 0x58 'X' - 0x00,0x00,0x42,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x42,0x00,0x00,0x00,0x00, + 8, // 0x58 'X' + 0x00,0x00,0x42,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - 8, // 0x59 'Y' - 0x00,0x00,0x22,0x22,0x22,0x22,0x14,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, + 8, // 0x59 'Y' + 0x00,0x00,0x22,0x22,0x22,0x22,0x14,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - 8, // 0x5a 'Z' - 0x00,0x00,0x7e,0x42,0x02,0x04,0x08,0x10,0x20,0x40,0x42,0x7e,0x00,0x00,0x00,0x00, + 8, // 0x5a 'Z' + 0x00,0x00,0x7e,0x42,0x02,0x04,0x08,0x10,0x20,0x40,0x42,0x7e,0x00,0x00,0x00,0x00, - 8, // 0x5b '[' - 0x00,0x1e,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1e,0x00,0x00,0x00, + 8, // 0x5b '[' + 0x00,0x1e,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1e,0x00,0x00,0x00, - 8, // 0x5c '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00,0x00,0x00, + 8, // 0x5c '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00,0x00,0x00, - 8, // 0x5d ']' - 0x00,0x3c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3c,0x00,0x00,0x00, + 8, // 0x5d ']' + 0x00,0x3c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3c,0x00,0x00,0x00, - 8, // 0x5e '^' - 0x00,0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x5e '^' + 0x00,0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, + 8, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, - 8, // 0x60 '`' - 0x00,0x00,0x08,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x60 '`' + 0x00,0x00,0x08,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x62 'b' - 0x00,0x00,0x60,0x20,0x20,0x38,0x24,0x22,0x22,0x22,0x22,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x62 'b' + 0x00,0x00,0x60,0x20,0x20,0x38,0x24,0x22,0x22,0x22,0x22,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x40,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x40,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x64 'd' - 0x00,0x00,0x0c,0x04,0x04,0x1c,0x24,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x64 'd' + 0x00,0x00,0x0c,0x04,0x04,0x1c,0x24,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x7e,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x7e,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x66 'f' - 0x00,0x00,0x0c,0x12,0x10,0x10,0x38,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, + 8, // 0x66 'f' + 0x00,0x00,0x0c,0x12,0x10,0x10,0x38,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, + 8, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, - 8, // 0x68 'h' - 0x00,0x00,0x60,0x20,0x20,0x2c,0x32,0x22,0x22,0x22,0x22,0x62,0x00,0x00,0x00,0x00, + 8, // 0x68 'h' + 0x00,0x00,0x60,0x20,0x20,0x2c,0x32,0x22,0x22,0x22,0x22,0x62,0x00,0x00,0x00,0x00, - 8, // 0x69 'i' - 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, + 8, // 0x69 'i' + 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - 8, // 0x6a 'j' - 0x00,0x00,0x04,0x04,0x00,0x0c,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00, + 8, // 0x6a 'j' + 0x00,0x00,0x04,0x04,0x00,0x0c,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00, - 8, // 0x6b 'k' - 0x00,0x00,0x60,0x20,0x20,0x22,0x24,0x28,0x38,0x24,0x22,0x62,0x00,0x00,0x00,0x00, + 8, // 0x6b 'k' + 0x00,0x00,0x60,0x20,0x20,0x22,0x24,0x28,0x38,0x24,0x22,0x62,0x00,0x00,0x00,0x00, - 8, // 0x6c 'l' - 0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, + 8, // 0x6c 'l' + 0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - 8, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00,0x00,0x00,0x00, + 8, // 0x6d 'm' + 0x00,0x00,0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00,0x00,0x00,0x00, - 8, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0x00,0x5c,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00, + 8, // 0x6e 'n' + 0x00,0x00,0x00,0x00,0x00,0x5c,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00, - 8, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x6f 'o' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x70,0x00, + 8, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x70,0x00, - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x0e,0x00, + 8, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x0e,0x00, - 8, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, + 8, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x3c,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x3c,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x74 't' - 0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x10,0x12,0x0c,0x00,0x00,0x00,0x00, + 8, // 0x74 't' + 0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x10,0x12,0x0c,0x00,0x00,0x00,0x00, - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x14,0x08,0x00,0x00,0x00,0x00, + 8, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x14,0x08,0x00,0x00,0x00,0x00, - 8, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x49,0x49,0x55,0x22,0x00,0x00,0x00,0x00, + 8, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x49,0x49,0x55,0x22,0x00,0x00,0x00,0x00, - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00,0x00,0x00,0x00, + 8, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00,0x00,0x00,0x00, - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x04,0x78,0x00, + 8, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x04,0x78,0x00, - 8, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x00,0x7e,0x44,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, + 8, // 0x7a 'z' + 0x00,0x00,0x00,0x00,0x00,0x7e,0x44,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, - 8, // 0x7b '{' - 0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x00,0x00, + 8, // 0x7b '{' + 0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x00,0x00, - 8, // 0x7c '|' - 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, + 8, // 0x7c '|' + 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, - 8, // 0x7d '}' - 0x00,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00, + 8, // 0x7d '}' + 0x00,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00, - 8, // 0x7e '~' - 0x00,0x00,0x39,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x7e '~' + 0x00,0x00,0x39,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x22,0x41,0x41,0x7f,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 8, // 0x7f '' + 0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x22,0x41,0x41,0x7f,0x00,0x00,0x00,0x00,0x00, + 0 +}; - const int8u gse8x16_bold[] = - { - 16, 0, 32, 128-32, +const int8u gse8x16_bold[] = +{ + 16, 0, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, - 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, - 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, - 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, - 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, - 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, - 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, - 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, - 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, - 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, - 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, + 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, + 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, + 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, + 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, + 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, + 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, + 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, + 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, + 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, + 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, + 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, - 8, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x21 '!' - 0x00,0x00,0x18,0x3c,0x3c,0x3c,0x3c,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, + 8, // 0x21 '!' + 0x00,0x00,0x18,0x3c,0x3c,0x3c,0x3c,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - 8, // 0x22 '"' - 0x00,0x66,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x22 '"' + 0x00,0x66,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x23 '#' - 0x00,0x00,0x66,0x66,0x66,0xff,0x66,0x66,0xff,0x66,0x66,0x66,0x00,0x00,0x00,0x00, + 8, // 0x23 '#' + 0x00,0x00,0x66,0x66,0x66,0xff,0x66,0x66,0xff,0x66,0x66,0x66,0x00,0x00,0x00,0x00, - 8, // 0x24 '$' - 0x00,0x08,0x08,0x3e,0x6b,0x6b,0x68,0x3e,0x0b,0x6b,0x6b,0x3e,0x08,0x08,0x00,0x00, + 8, // 0x24 '$' + 0x00,0x08,0x08,0x3e,0x6b,0x6b,0x68,0x3e,0x0b,0x6b,0x6b,0x3e,0x08,0x08,0x00,0x00, - 8, // 0x25 '%' - 0x00,0x00,0x66,0xbe,0xcc,0x0c,0x18,0x18,0x30,0x33,0x65,0x66,0x00,0x00,0x00,0x00, + 8, // 0x25 '%' + 0x00,0x00,0x66,0xbe,0xcc,0x0c,0x18,0x18,0x30,0x33,0x65,0x66,0x00,0x00,0x00,0x00, - 8, // 0x26 '&' - 0x00,0x00,0x1c,0x36,0x36,0x36,0x1c,0x3b,0x6e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, + 8, // 0x26 '&' + 0x00,0x00,0x1c,0x36,0x36,0x36,0x1c,0x3b,0x6e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - 8, // 0x27 ''' - 0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x27 ''' + 0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x28 '(' - 0x00,0x06,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0c,0x06,0x00,0x00,0x00, + 8, // 0x28 '(' + 0x00,0x06,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0c,0x06,0x00,0x00,0x00, - 8, // 0x29 ')' - 0x00,0x30,0x18,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00, + 8, // 0x29 ')' + 0x00,0x30,0x18,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00, - 8, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2a '*' + 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2b '+' + 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, + 8, // 0x2c ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, - 8, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2d '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, + 8, // 0x2e '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - 8, // 0x2f '/' - 0x00,0x03,0x03,0x06,0x06,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00,0x00, + 8, // 0x2f '/' + 0x00,0x03,0x03,0x06,0x06,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00,0x00, - 8, // 0x30 '0' - 0x00,0x00,0x3e,0x63,0x63,0x67,0x6b,0x73,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x30 '0' + 0x00,0x00,0x3e,0x63,0x63,0x67,0x6b,0x73,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x31 '1' - 0x00,0x00,0x0c,0x0c,0x1c,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x00,0x00,0x00,0x00, + 8, // 0x31 '1' + 0x00,0x00,0x0c,0x0c,0x1c,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x00,0x00,0x00,0x00, - 8, // 0x32 '2' - 0x00,0x00,0x3e,0x63,0x63,0x03,0x06,0x0c,0x18,0x30,0x61,0x7f,0x00,0x00,0x00,0x00, + 8, // 0x32 '2' + 0x00,0x00,0x3e,0x63,0x63,0x03,0x06,0x0c,0x18,0x30,0x61,0x7f,0x00,0x00,0x00,0x00, - 8, // 0x33 '3' - 0x00,0x00,0x7f,0x43,0x06,0x0c,0x1e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x33 '3' + 0x00,0x00,0x7f,0x43,0x06,0x0c,0x1e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x34 '4' - 0x00,0x00,0x06,0x0c,0x18,0x32,0x66,0x66,0x7f,0x06,0x06,0x0f,0x00,0x00,0x00,0x00, + 8, // 0x34 '4' + 0x00,0x00,0x06,0x0c,0x18,0x32,0x66,0x66,0x7f,0x06,0x06,0x0f,0x00,0x00,0x00,0x00, - 8, // 0x35 '5' - 0x00,0x00,0x7f,0x61,0x60,0x60,0x7e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x35 '5' + 0x00,0x00,0x7f,0x61,0x60,0x60,0x7e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x36 '6' - 0x00,0x00,0x1e,0x30,0x60,0x60,0x7e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x36 '6' + 0x00,0x00,0x1e,0x30,0x60,0x60,0x7e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x37 '7' - 0x00,0x00,0x7f,0x63,0x63,0x03,0x06,0x0c,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, + 8, // 0x37 '7' + 0x00,0x00,0x7f,0x63,0x63,0x03,0x06,0x0c,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, - 8, // 0x38 '8' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x3e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x38 '8' + 0x00,0x00,0x3e,0x63,0x63,0x63,0x3e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x39 '9' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x3f,0x03,0x03,0x06,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x39 '9' + 0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x3f,0x03,0x03,0x06,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, + 8, // 0x3a ':' + 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, + 8, // 0x3b ';' + 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, - 8, // 0x3c '<' - 0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, + 8, // 0x3c '<' + 0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, - 8, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x3d '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3e '>' - 0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x03,0x06,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, + 8, // 0x3e '>' + 0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x03,0x06,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, - 8, // 0x3f '?' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x06,0x0c,0x0c,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00, + 8, // 0x3f '?' + 0x00,0x00,0x3e,0x63,0x63,0x63,0x06,0x0c,0x0c,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00, - 8, // 0x40 '@' - 0x00,0x00,0x7c,0x86,0x03,0x73,0xdb,0xdb,0xdb,0xdb,0xdb,0x6e,0x00,0x00,0x00,0x00, + 8, // 0x40 '@' + 0x00,0x00,0x7c,0x86,0x03,0x73,0xdb,0xdb,0xdb,0xdb,0xdb,0x6e,0x00,0x00,0x00,0x00, - 8, // 0x41 'A' - 0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x41 'A' + 0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x42 'B' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x3e,0x33,0x33,0x33,0x33,0x7e,0x00,0x00,0x00,0x00, + 8, // 0x42 'B' + 0x00,0x00,0x7e,0x33,0x33,0x33,0x3e,0x33,0x33,0x33,0x33,0x7e,0x00,0x00,0x00,0x00, - 8, // 0x43 'C' - 0x00,0x00,0x1e,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x43 'C' + 0x00,0x00,0x1e,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x44 'D' - 0x00,0x00,0x7c,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7c,0x00,0x00,0x00,0x00, + 8, // 0x44 'D' + 0x00,0x00,0x7c,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7c,0x00,0x00,0x00,0x00, - 8, // 0x45 'E' - 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, + 8, // 0x45 'E' + 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, - 8, // 0x46 'F' - 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, + 8, // 0x46 'F' + 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - 8, // 0x47 'G' - 0x00,0x00,0x1f,0x33,0x61,0x60,0x60,0x6f,0x63,0x63,0x33,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x47 'G' + 0x00,0x00,0x1f,0x33,0x61,0x60,0x60,0x6f,0x63,0x63,0x33,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x48 'H' - 0x00,0x00,0x63,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x48 'H' + 0x00,0x00,0x63,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x49 'I' - 0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x49 'I' + 0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x4a 'J' - 0x00,0x00,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x4a 'J' + 0x00,0x00,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x4b 'K' - 0x00,0x00,0x73,0x33,0x36,0x36,0x3c,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, + 8, // 0x4b 'K' + 0x00,0x00,0x73,0x33,0x36,0x36,0x3c,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - 8, // 0x4c 'L' - 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, + 8, // 0x4c 'L' + 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, - 8, // 0x4d 'M' - 0x00,0x00,0x63,0x63,0x77,0x77,0x7f,0x6b,0x6b,0x63,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x4d 'M' + 0x00,0x00,0x63,0x63,0x77,0x77,0x7f,0x6b,0x6b,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x4e 'N' - 0x00,0x00,0x63,0x63,0x73,0x7b,0x6f,0x67,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x4e 'N' + 0x00,0x00,0x63,0x63,0x73,0x7b,0x6f,0x67,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x4f 'O' - 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x00,0x00,0x00,0x00, + 8, // 0x4f 'O' + 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x00,0x00,0x00,0x00, - 8, // 0x50 'P' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, + 8, // 0x50 'P' + 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - 8, // 0x51 'Q' - 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x6f,0x36,0x1e,0x03,0x00,0x00,0x00, + 8, // 0x51 'Q' + 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x6f,0x36,0x1e,0x03,0x00,0x00,0x00, - 8, // 0x52 'R' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, + 8, // 0x52 'R' + 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - 8, // 0x53 'S' - 0x00,0x00,0x3e,0x63,0x63,0x30,0x18,0x0c,0x06,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x53 'S' + 0x00,0x00,0x3e,0x63,0x63,0x30,0x18,0x0c,0x06,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x54 'T' - 0x00,0x00,0x3f,0x3f,0x2d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x54 'T' + 0x00,0x00,0x3f,0x3f,0x2d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x55 'U' - 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x55 'U' + 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x56 'V' - 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, + 8, // 0x56 'V' + 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, - 8, // 0x57 'W' - 0x00,0x00,0x63,0x63,0x63,0x6b,0x6b,0x7f,0x77,0x77,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x57 'W' + 0x00,0x00,0x63,0x63,0x63,0x6b,0x6b,0x7f,0x77,0x77,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x58 'X' - 0x00,0x00,0x63,0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x58 'X' + 0x00,0x00,0x63,0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x59 'Y' - 0x00,0x00,0x33,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x59 'Y' + 0x00,0x00,0x33,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x5a 'Z' - 0x00,0x00,0x7f,0x63,0x43,0x06,0x0c,0x18,0x30,0x61,0x63,0x7f,0x00,0x00,0x00,0x00, + 8, // 0x5a 'Z' + 0x00,0x00,0x7f,0x63,0x43,0x06,0x0c,0x18,0x30,0x61,0x63,0x7f,0x00,0x00,0x00,0x00, - 8, // 0x5b '[' - 0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00, + 8, // 0x5b '[' + 0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00, - 8, // 0x5c '\' - 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x06,0x06,0x03,0x03,0x00,0x00,0x00, + 8, // 0x5c '\' + 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x06,0x06,0x03,0x03,0x00,0x00,0x00, - 8, // 0x5d ']' - 0x00,0x7c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x7c,0x00,0x00,0x00, + 8, // 0x5d ']' + 0x00,0x7c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x7c,0x00,0x00,0x00, - 8, // 0x5e '^' - 0x00,0x00,0x08,0x1c,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x5e '^' + 0x00,0x00,0x08,0x1c,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, + 8, // 0x5f '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, - 8, // 0x60 '`' - 0x00,0x00,0x18,0x18,0x18,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x60 '`' + 0x00,0x00,0x18,0x18,0x18,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x06,0x3e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x06,0x3e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - 8, // 0x62 'b' - 0x00,0x00,0x70,0x30,0x30,0x3c,0x36,0x33,0x33,0x33,0x33,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x62 'b' + 0x00,0x00,0x70,0x30,0x30,0x3c,0x36,0x33,0x33,0x33,0x33,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x60,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x60,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x64 'd' - 0x00,0x00,0x0e,0x06,0x06,0x1e,0x36,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, + 8, // 0x64 'd' + 0x00,0x00,0x0e,0x06,0x06,0x1e,0x36,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x7f,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x7f,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x66 'f' - 0x00,0x00,0x0e,0x1b,0x1b,0x18,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, + 8, // 0x66 'f' + 0x00,0x00,0x0e,0x1b,0x1b,0x18,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x66,0x3c,0x00, + 8, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x66,0x3c,0x00, - 8, // 0x68 'h' - 0x00,0x00,0x70,0x30,0x30,0x36,0x3b,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00, + 8, // 0x68 'h' + 0x00,0x00,0x70,0x30,0x30,0x36,0x3b,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - 8, // 0x69 'i' - 0x00,0x00,0x0c,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x69 'i' + 0x00,0x00,0x0c,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x6a 'j' - 0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00, + 8, // 0x6a 'j' + 0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00, - 8, // 0x6b 'k' - 0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3c,0x36,0x33,0x73,0x00,0x00,0x00,0x00, + 8, // 0x6b 'k' + 0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3c,0x36,0x33,0x73,0x00,0x00,0x00,0x00, - 8, // 0x6c 'l' - 0x00,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, + 8, // 0x6c 'l' + 0x00,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - 8, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0x00,0x76,0x7f,0x6b,0x6b,0x6b,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x6d 'm' + 0x00,0x00,0x00,0x00,0x00,0x76,0x7f,0x6b,0x6b,0x6b,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00, + 8, // 0x6e 'n' + 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00, - 8, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x6f 'o' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x78,0x00, + 8, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x78,0x00, - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x06,0x0f,0x00, + 8, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x06,0x0f,0x00, - 8, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, + 8, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x60,0x3e,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, + 8, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x60,0x3e,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - 8, // 0x74 't' - 0x00,0x00,0x08,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x1b,0x0e,0x00,0x00,0x00,0x00, + 8, // 0x74 't' + 0x00,0x00,0x08,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x1b,0x0e,0x00,0x00,0x00,0x00, - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, + 8, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, + 8, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, - 8, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x6b,0x6b,0x7f,0x36,0x36,0x00,0x00,0x00,0x00, + 8, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x6b,0x6b,0x7f,0x36,0x36,0x00,0x00,0x00,0x00, - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x1c,0x36,0x63,0x63,0x00,0x00,0x00,0x00, + 8, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x1c,0x36,0x63,0x63,0x00,0x00,0x00,0x00, - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x3f,0x03,0x06,0x7c,0x00, + 8, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x3f,0x03,0x06,0x7c,0x00, - 8, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x00,0x7f,0x63,0x06,0x0c,0x18,0x31,0x7f,0x00,0x00,0x00,0x00, + 8, // 0x7a 'z' + 0x00,0x00,0x00,0x00,0x00,0x7f,0x63,0x06,0x0c,0x18,0x31,0x7f,0x00,0x00,0x00,0x00, - 8, // 0x7b '{' - 0x00,0x03,0x04,0x0c,0x0c,0x0c,0x08,0x30,0x08,0x0c,0x0c,0x0c,0x04,0x03,0x00,0x00, + 8, // 0x7b '{' + 0x00,0x03,0x04,0x0c,0x0c,0x0c,0x08,0x30,0x08,0x0c,0x0c,0x0c,0x04,0x03,0x00,0x00, - 8, // 0x7c '|' - 0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00, + 8, // 0x7c '|' + 0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00, - 8, // 0x7d '}' - 0x00,0x60,0x10,0x18,0x18,0x18,0x08,0x06,0x08,0x18,0x18,0x18,0x10,0x60,0x00,0x00, + 8, // 0x7d '}' + 0x00,0x60,0x10,0x18,0x18,0x18,0x08,0x06,0x08,0x18,0x18,0x18,0x10,0x60,0x00,0x00, - 8, // 0x7e '~' - 0x00,0x00,0x3b,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x7e '~' + 0x00,0x00,0x3b,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x7f,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 8, // 0x7f '' + 0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x7f,0x00,0x00,0x00,0x00,0x00, + 0 +}; - const int8u mcs11_prop[] = - { - 11, 2, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, +const int8u mcs11_prop[] = +{ + 11, 2, 32, 128-32, + 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, + 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, + 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, + 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, + 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, + 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, + 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, + 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, + 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, + 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, + 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, + 4, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x22 '"' + 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00, + 6, // 0x23 '#' + 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00, - 6, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10, + 6, // 0x24 '$' + 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10, - 6, // 0x25 '%' - 0x00,0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00, + 6, // 0x25 '%' + 0x00,0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00, - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00, + 6, // 0x26 '&' + 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00, - 3, // 0x27 ''' - 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, + 4, // 0x28 '(' + 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, + 5, // 0x29 ')' + 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, + 6, // 0x2A '*' + 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, - 6, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 6, // 0x2B '+' + 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40, + 7, // 0x2F '/' + 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40, - 6, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00, + 6, // 0x30 '0' + 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00, - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 4, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 6, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, + 6, // 0x32 '2' + 0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00, + 6, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00, - 6, // 0x34 '4' - 0x00,0x08,0x18,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00, + 6, // 0x34 '4' + 0x00,0x08,0x18,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00, - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00, + 6, // 0x35 '5' + 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00, - 6, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x40,0x78,0x44,0x44,0x44,0x38,0x00, + 6, // 0x36 '6' + 0x00,0x38,0x44,0x40,0x40,0x78,0x44,0x44,0x44,0x38,0x00, - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00, + 6, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00, - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00, + 6, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00, - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00, + 6, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, - 6, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, + 6, // 0x3C '<' + 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, + 6, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - 6, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, + 6, // 0x3E '>' + 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00, + 6, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00, - 6, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00, + 6, // 0x40 '@' + 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00, - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00, + 6, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00, - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00, + 6, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00, - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00, + 6, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00, - 6, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00, + 6, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00, - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00, + 6, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00, - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00, + 6, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00, - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00, + 6, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00, - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00, + 6, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00, - 4, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 4, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00, + 6, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00, - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00, + 6, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00, - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00, + 6, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00, - 8, // 0x4D 'M' - 0x00,0x41,0x63,0x55,0x49,0x49,0x41,0x41,0x41,0x41,0x00, + 8, // 0x4D 'M' + 0x00,0x41,0x63,0x55,0x49,0x49,0x41,0x41,0x41,0x41,0x00, - 7, // 0x4E 'N' - 0x00,0x42,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x42,0x00, + 7, // 0x4E 'N' + 0x00,0x42,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x42,0x00, - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, + 6, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00, + 6, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00, - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00, + 6, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00, - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x00, + 6, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x00, - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00, + 6, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00, - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, + 6, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, + 6, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00, + 6, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00, - 8, // 0x57 'W' - 0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x49,0x55,0x22,0x00, + 8, // 0x57 'W' + 0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x49,0x55,0x22,0x00, - 6, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00, + 6, // 0x58 'X' + 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00, - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00, + 6, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00, - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00, + 6, // 0x5A 'Z' + 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00, - 5, // 0x5B '[' - 0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30, + 5, // 0x5B '[' + 0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30, - 7, // 0x5C '\' - 0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, + 7, // 0x5C '\' + 0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - 4, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, + 4, // 0x5D ']' + 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x5E '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00, - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x60 '`' + 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00, - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00, + 6, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00, - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00, + 6, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00, - 4, // 0x66 'f' - 0x00,0x10,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 4, // 0x66 'f' + 0x00,0x10,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, + 6, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, - 2, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, + 2, // 0x69 'i' + 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - 3, // 0x6A 'j' - 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, + 3, // 0x6A 'j' + 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - 5, // 0x6B 'k' - 0x00,0x40,0x40,0x48,0x50,0x60,0x60,0x50,0x48,0x48,0x00, + 5, // 0x6B 'k' + 0x00,0x40,0x40,0x48,0x50,0x60,0x60,0x50,0x48,0x48,0x00, - 2, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, + 2, // 0x6C 'l' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - 8, // 0x6D 'm' - 0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00, + 8, // 0x6D 'm' + 0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00, - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, + 6, // 0x6E 'n' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00, + 6, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, + 6, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x20,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x20,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00, - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x28,0x10,0x00, + 5, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x28,0x10,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00, - 8, // 0x77 'w' - 0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x36,0x00, + 8, // 0x77 'w' + 0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x36,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, + 6, // 0x7A 'z' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18, + 5, // 0x7B '{' + 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18, - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, + 3, // 0x7C '|' + 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0, + 5, // 0x7D '}' + 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0, - 6, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x7E '~' + 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, + 6, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs11_prop_condensed[] = - { - 11, 2, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, +const int8u mcs11_prop_condensed[] = +{ + 11, 2, 32, 128-32, + 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, + 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, + 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, + 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, + 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, + 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, + 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, + 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, + 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, + 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, + 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 3, // 0x21 '!' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x00, + 3, // 0x21 '!' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x00, - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x22 '"' + 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, + 5, // 0x23 '#' + 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, + 5, // 0x24 '$' + 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, + 5, // 0x25 '%' + 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00, + 5, // 0x26 '&' + 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00, - 5, // 0x27 ''' - 0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, + 5, // 0x28 '(' + 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - 4, // 0x29 ')' - 0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80, + 4, // 0x29 ')' + 0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80, - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, + 5, // 0x2A '*' + 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, + 5, // 0x2B '+' + 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, + 5, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00, - 6, // 0x2F '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, + 6, // 0x2F '/' + 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x30 '0' + 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - 3, // 0x31 '1' - 0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, + 3, // 0x31 '1' + 0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x10,0x20,0x40,0x80,0xF0,0x00, + 5, // 0x32 '2' + 0x00,0x60,0x90,0x90,0x10,0x10,0x20,0x40,0x80,0xF0,0x00, - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x10,0x60,0x10,0x10,0x90,0x60,0x00, + 5, // 0x33 '3' + 0x00,0x60,0x90,0x10,0x10,0x60,0x10,0x10,0x90,0x60,0x00, - 5, // 0x34 '4' - 0x00,0x10,0x30,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, + 5, // 0x34 '4' + 0x00,0x10,0x30,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, - 5, // 0x35 '5' - 0x00,0xF0,0x80,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00, + 5, // 0x35 '5' + 0x00,0xF0,0x80,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00, - 5, // 0x36 '6' - 0x00,0x60,0x90,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, + 5, // 0x36 '6' + 0x00,0x60,0x90,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, + 5, // 0x37 '7' + 0x00,0xF0,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, + 5, // 0x38 '8' + 0x00,0x60,0x90,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x90,0x60,0x00, + 5, // 0x39 '9' + 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x90,0x60,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, - 6, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, + 6, // 0x3C '<' + 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, + 5, // 0x3D '=' + 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, - 6, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, + 6, // 0x3E '>' + 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, + 5, // 0x3F '?' + 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0xB0,0x80,0x80,0x70,0x00, + 5, // 0x40 '@' + 0x00,0x60,0x90,0x90,0xB0,0xB0,0xB0,0x80,0x80,0x70,0x00, - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, + 5, // 0x41 'A' + 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x42 'B' + 0x00,0xE0,0x90,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x80,0x90,0x60,0x00, + 5, // 0x43 'C' + 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x80,0x90,0x60,0x00, - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x44 'D' + 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, + 5, // 0x45 'E' + 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, + 5, // 0x46 'F' + 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, - 5, // 0x47 'G' - 0x00,0x70,0x80,0x80,0x80,0xB0,0x90,0x90,0x90,0x60,0x00, + 5, // 0x47 'G' + 0x00,0x70,0x80,0x80,0x80,0xB0,0x90,0x90,0x90,0x60,0x00, - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, + 5, // 0x48 'H' + 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - 4, // 0x49 'I' - 0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xE0,0x00, + 4, // 0x49 'I' + 0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xE0,0x00, - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00, + 5, // 0x4A 'J' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00, - 5, // 0x4B 'K' - 0x00,0x90,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00, + 5, // 0x4B 'K' + 0x00,0x90,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00, - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, + 5, // 0x4C 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, - 6, // 0x4D 'M' - 0x00,0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00, + 6, // 0x4D 'M' + 0x00,0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00, - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x90,0x00, + 5, // 0x4E 'N' + 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x90,0x00, - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x4F 'O' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, + 5, // 0x50 'P' + 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, + 5, // 0x51 'Q' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, + 5, // 0x52 'R' + 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x80,0x60,0x10,0x10,0x90,0x60,0x00, + 5, // 0x53 'S' + 0x00,0x60,0x90,0x80,0x80,0x60,0x10,0x10,0x90,0x60,0x00, - 6, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 6, // 0x54 'T' + 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x55 'U' + 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00, + 6, // 0x56 'V' + 0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00, - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0xA8,0x50,0x00, + 6, // 0x57 'W' + 0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0xA8,0x50,0x00, - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x90,0x00, + 5, // 0x58 'X' + 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x90,0x00, - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00, + 6, // 0x59 'Y' + 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00, - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0xF0,0x00, + 5, // 0x5A 'Z' + 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0xF0,0x00, - 4, // 0x5B '[' - 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0x00, + 4, // 0x5B '[' + 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0x00, - 6, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, + 6, // 0x5C '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - 4, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x00, + 4, // 0x5D ']' + 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x00, - 5, // 0x5E '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x5E '^' + 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, + 5, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x90,0x10,0x70,0x90,0x90,0x70,0x00, + 5, // 0x61 'a' + 0x00,0x00,0x00,0x60,0x90,0x10,0x70,0x90,0x90,0x70,0x00, - 5, // 0x62 'b' - 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x62 'b' + 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, + 5, // 0x63 'c' + 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, - 5, // 0x64 'd' - 0x00,0x10,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, + 5, // 0x64 'd' + 0x00,0x10,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x90,0x60,0x00, + 5, // 0x65 'e' + 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x90,0x60,0x00, - 4, // 0x66 'f' - 0x00,0x20,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, + 4, // 0x66 'f' + 0x00,0x20,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x90,0x60, + 5, // 0x67 'g' + 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x90,0x60, - 5, // 0x68 'h' - 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, + 5, // 0x68 'h' + 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - 2, // 0x69 'i' - 0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 2, // 0x69 'i' + 0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, - 4, // 0x6A 'j' - 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, + 4, // 0x6A 'j' + 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, + 5, // 0x6B 'k' + 0x00,0x80,0x80,0x90,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, - 2, // 0x6C 'l' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 2, // 0x6C 'l' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, - 6, // 0x6D 'm' - 0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x00, + 6, // 0x6D 'm' + 0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x00, - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x90,0x90,0x00, + 5, // 0x6E 'n' + 0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x90,0x90,0x00, - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x6F 'o' + 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, + 5, // 0x70 'p' + 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, + 5, // 0x71 'q' + 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, - 6, // 0x72 'r' - 0x00,0x00,0x00,0xB8,0x48,0x40,0x40,0x40,0x40,0x40,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0xB8,0x48,0x40,0x40,0x40,0x40,0x40,0x00, - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x10,0x90,0x60,0x00, + 5, // 0x73 's' + 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x10,0x90,0x60,0x00, - 4, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x20,0x00, + 4, // 0x74 't' + 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x20,0x00, - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x70,0x00, + 5, // 0x75 'u' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00, + 6, // 0x77 'w' + 0x00,0x00,0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00, - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, + 5, // 0x78 'x' + 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0x20,0xC0, + 5, // 0x79 'y' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0x20,0xC0, - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0x80,0xF0,0x00, + 5, // 0x7A 'z' + 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0x80,0xF0,0x00, - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, + 5, // 0x7B '{' + 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, + 3, // 0x7C '|' + 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, + 5, // 0x7D '}' + 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x7E '~' + 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, + 5, // 0x7F '' + 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs12_prop[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x62,0x02,0x6F,0x02,0x7C,0x02,0x89,0x02,0x96,0x02,0xA3,0x02,0xB0,0x02,0xBD,0x02, - 0xCA,0x02,0xD7,0x02,0xF0,0x02,0xFD,0x02,0x0A,0x03,0x17,0x03,0x24,0x03,0x31,0x03,0x3E,0x03, - 0x4B,0x03,0x58,0x03,0x65,0x03,0x72,0x03,0x7F,0x03,0x8C,0x03,0x99,0x03,0xA6,0x03,0xB3,0x03, - 0xC0,0x03,0xCD,0x03,0xDA,0x03,0xE7,0x03,0xF4,0x03,0x01,0x04,0x1A,0x04,0x27,0x04,0x34,0x04, - 0x41,0x04,0x4E,0x04,0x5B,0x04,0x68,0x04,0x75,0x04,0x82,0x04,0x8F,0x04,0xA8,0x04,0xB5,0x04, - 0xC2,0x04,0xCF,0x04,0xDC,0x04,0xE9,0x04,0xF6,0x04,0x03,0x05, +const int8u mcs12_prop[] = +{ + 12, 3, 32, 128-32, + 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, + 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, + 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, + 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, + 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, + 0x49,0x02,0x62,0x02,0x6F,0x02,0x7C,0x02,0x89,0x02,0x96,0x02,0xA3,0x02,0xB0,0x02,0xBD,0x02, + 0xCA,0x02,0xD7,0x02,0xF0,0x02,0xFD,0x02,0x0A,0x03,0x17,0x03,0x24,0x03,0x31,0x03,0x3E,0x03, + 0x4B,0x03,0x58,0x03,0x65,0x03,0x72,0x03,0x7F,0x03,0x8C,0x03,0x99,0x03,0xA6,0x03,0xB3,0x03, + 0xC0,0x03,0xCD,0x03,0xDA,0x03,0xE7,0x03,0xF4,0x03,0x01,0x04,0x1A,0x04,0x27,0x04,0x34,0x04, + 0x41,0x04,0x4E,0x04,0x5B,0x04,0x68,0x04,0x75,0x04,0x82,0x04,0x8F,0x04,0xA8,0x04,0xB5,0x04, + 0xC2,0x04,0xCF,0x04,0xDC,0x04,0xE9,0x04,0xF6,0x04,0x03,0x05, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 4, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x22 '"' + 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, + 6, // 0x23 '#' + 0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, - 6, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, + 6, // 0x24 '$' + 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - 7, // 0x25 '%' - 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, + 7, // 0x25 '%' + 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00, - 3, // 0x27 ''' - 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00, + 5, // 0x28 '(' + 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00, - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00, + 5, // 0x29 ')' + 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00, - 6, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, + 6, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - 6, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 6, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, + 7, // 0x2F '/' + 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, + 4, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, + 6, // 0x34 '4' + 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, + 6, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x40,0x80, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - 6, // 0x3C '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, + 6, // 0x3C '<' + 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, + 6, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - 6, // 0x3E '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, + 6, // 0x3E '>' + 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, + 6, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - 9, // 0x4D 'M' - 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4D 'M' + 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, + 7, // 0x4E 'N' + 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 6, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, + 6, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - 9, // 0x57 'W' - 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00, + 9, // 0x57 'W' + 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x5A 'Z' + 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - 4, // 0x5B '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, + 4, // 0x5B '[' + 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, + 7, // 0x5C '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - 4, // 0x5D ']' - 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00, + 4, // 0x5D ']' + 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00, - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x5E '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x60 '`' + 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - 4, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 4, // 0x66 'f' + 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60, + 5, // 0x6A 'j' + 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60, - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, + 6, // 0x6B 'k' + 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x6E 'n' + 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00, + 5, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00, + 9, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 6, // 0x7A 'z' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, + 5, // 0x7B '{' + 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, + 3, // 0x7C '|' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00, + 5, // 0x7D '}' + 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00, - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7E '~' + 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs13_prop[] = - { - 13, 4, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x38,0x00,0x46,0x00,0x54,0x00,0x62,0x00,0x70,0x00, - 0x7E,0x00,0x8C,0x00,0x9A,0x00,0xA8,0x00,0xB6,0x00,0xC4,0x00,0xD2,0x00,0xE0,0x00,0xEE,0x00, - 0xFC,0x00,0x0A,0x01,0x18,0x01,0x26,0x01,0x34,0x01,0x42,0x01,0x50,0x01,0x5E,0x01,0x6C,0x01, - 0x7A,0x01,0x88,0x01,0x96,0x01,0xA4,0x01,0xB2,0x01,0xC0,0x01,0xCE,0x01,0xDC,0x01,0xEA,0x01, - 0xF8,0x01,0x06,0x02,0x14,0x02,0x22,0x02,0x30,0x02,0x3E,0x02,0x4C,0x02,0x5A,0x02,0x68,0x02, - 0x76,0x02,0x91,0x02,0x9F,0x02,0xAD,0x02,0xBB,0x02,0xC9,0x02,0xD7,0x02,0xE5,0x02,0xF3,0x02, - 0x01,0x03,0x0F,0x03,0x2A,0x03,0x38,0x03,0x46,0x03,0x54,0x03,0x62,0x03,0x70,0x03,0x7E,0x03, - 0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03,0xC4,0x03,0xD2,0x03,0xE0,0x03,0xEE,0x03,0xFC,0x03, - 0x0A,0x04,0x18,0x04,0x26,0x04,0x34,0x04,0x42,0x04,0x50,0x04,0x6B,0x04,0x79,0x04,0x87,0x04, - 0x95,0x04,0xA3,0x04,0xB1,0x04,0xBF,0x04,0xCD,0x04,0xDB,0x04,0xE9,0x04,0x04,0x05,0x12,0x05, - 0x20,0x05,0x2E,0x05,0x3C,0x05,0x4A,0x05,0x58,0x05,0x66,0x05, +const int8u mcs13_prop[] = +{ + 13, 4, 32, 128-32, + 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x38,0x00,0x46,0x00,0x54,0x00,0x62,0x00,0x70,0x00, + 0x7E,0x00,0x8C,0x00,0x9A,0x00,0xA8,0x00,0xB6,0x00,0xC4,0x00,0xD2,0x00,0xE0,0x00,0xEE,0x00, + 0xFC,0x00,0x0A,0x01,0x18,0x01,0x26,0x01,0x34,0x01,0x42,0x01,0x50,0x01,0x5E,0x01,0x6C,0x01, + 0x7A,0x01,0x88,0x01,0x96,0x01,0xA4,0x01,0xB2,0x01,0xC0,0x01,0xCE,0x01,0xDC,0x01,0xEA,0x01, + 0xF8,0x01,0x06,0x02,0x14,0x02,0x22,0x02,0x30,0x02,0x3E,0x02,0x4C,0x02,0x5A,0x02,0x68,0x02, + 0x76,0x02,0x91,0x02,0x9F,0x02,0xAD,0x02,0xBB,0x02,0xC9,0x02,0xD7,0x02,0xE5,0x02,0xF3,0x02, + 0x01,0x03,0x0F,0x03,0x2A,0x03,0x38,0x03,0x46,0x03,0x54,0x03,0x62,0x03,0x70,0x03,0x7E,0x03, + 0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03,0xC4,0x03,0xD2,0x03,0xE0,0x03,0xEE,0x03,0xFC,0x03, + 0x0A,0x04,0x18,0x04,0x26,0x04,0x34,0x04,0x42,0x04,0x50,0x04,0x6B,0x04,0x79,0x04,0x87,0x04, + 0x95,0x04,0xA3,0x04,0xB1,0x04,0xBF,0x04,0xCD,0x04,0xDB,0x04,0xE9,0x04,0x04,0x05,0x12,0x05, + 0x20,0x05,0x2E,0x05,0x3C,0x05,0x4A,0x05,0x58,0x05,0x66,0x05, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 4, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 4, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x22 '"' + 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x00,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, + 6, // 0x23 '#' + 0x00,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, - 6, // 0x24 '$' - 0x00,0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, + 6, // 0x24 '$' + 0x00,0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - 7, // 0x25 '%' - 0x00,0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, + 7, // 0x25 '%' + 0x00,0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00,0x00, - 3, // 0x27 ''' - 0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00,0x00, + 5, // 0x28 '(' + 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00,0x00, - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00,0x00, + 5, // 0x29 ')' + 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00,0x00, - 6, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00,0x00, + 6, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00,0x00, - 6, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, + 6, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, + 7, // 0x2F '/' + 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, + 4, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, + 6, // 0x34 '4' + 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00,0x00, + 6, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, - 6, // 0x3C '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, + 6, // 0x3C '<' + 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 6, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 6, // 0x3E '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, + 6, // 0x3E '>' + 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, + 6, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, + 6, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00,0x00, + 6, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - 9, // 0x4D 'M' - 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4D 'M' + 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00,0x00, + 7, // 0x4E 'N' + 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00,0x00, - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 6, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, + 6, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - 9, // 0x57 'W' - 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x57 'W' + 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, + 6, // 0x5A 'Z' + 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, - 4, // 0x5B '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00,0x00, + 4, // 0x5B '[' + 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00,0x00, - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00, + 7, // 0x5C '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00, - 4, // 0x5D ']' - 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00,0x00, + 4, // 0x5D ']' + 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00,0x00, - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x5E '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x60 '`' + 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, - 4, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 4, // 0x66 'f' + 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00, + 5, // 0x6A 'j' + 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, + 6, // 0x6B 'k' + 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x6E 'n' + 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x00, - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, + 5, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, + 6, // 0x7A 'z' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00,0x00, + 5, // 0x7B '{' + 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x7C '|' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00,0x00, + 5, // 0x7D '}' + 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00,0x00, - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7E '~' + 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs5x10_mono[] = - { - 10, 2, 32, 128-32, - 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, - 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, - 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, - 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, - 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, - 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, - 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, - 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, - 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, - 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, - 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, +const int8u mcs5x10_mono[] = +{ + 10, 2, 32, 128-32, + 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, + 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, + 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, + 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, + 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, + 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, + 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, + 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, + 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, + 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, + 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, + 5, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - 5, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50, + 5, // 0x23 '#' + 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50, - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20, + 5, // 0x24 '$' + 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20, - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90, + 5, // 0x25 '%' + 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90, - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68, + 5, // 0x26 '&' + 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68, - 5, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, + 5, // 0x28 '(' + 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, + 5, // 0x29 ')' + 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00, + 5, // 0x2A '*' + 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00, - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00, + 5, // 0x2B '+' + 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, + 5, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, - 5, // 0x2F '/' - 0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00, + 5, // 0x2F '/' + 0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00, - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x30 '0' + 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00, + 5, // 0x32 '2' + 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00, - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, + 5, // 0x33 '3' + 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, - 5, // 0x34 '4' - 0x00,0x10,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, + 5, // 0x34 '4' + 0x00,0x10,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, - 5, // 0x35 '5' - 0x00,0xF0,0x80,0x80,0xE0,0x10,0x10,0x90,0x60,0x00, + 5, // 0x35 '5' + 0x00,0xF0,0x80,0x80,0xE0,0x10,0x10,0x90,0x60,0x00, - 5, // 0x36 '6' - 0x00,0x60,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, + 5, // 0x36 '6' + 0x00,0x60,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, + 5, // 0x37 '7' + 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, + 5, // 0x38 '8' + 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x60,0x00, + 5, // 0x39 '9' + 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x60,0x00, - 5, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00, + 5, // 0x3A ':' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00, - 5, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xC0, + 5, // 0x3B ';' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xC0, - 5, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08, + 5, // 0x3C '<' + 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08, - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0xF0,0x00,0x00,0x00, + 5, // 0x3D '=' + 0x00,0x00,0x00,0x00,0xF0,0x00,0xF0,0x00,0x00,0x00, - 5, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80, + 5, // 0x3E '>' + 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80, - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00, + 5, // 0x3F '?' + 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00, - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00, + 5, // 0x40 '@' + 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00, - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, + 5, // 0x41 'A' + 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x42 'B' + 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00, + 5, // 0x43 'C' + 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00, - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x44 'D' + 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, + 5, // 0x45 'E' + 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, + 5, // 0x46 'F' + 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00, + 5, // 0x47 'G' + 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00, - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, + 5, // 0x48 'H' + 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0x40,0x00, + 5, // 0x4A 'J' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0x40,0x00, - 5, // 0x4B 'K' - 0x00,0x90,0xA0,0xA0,0xC0,0xC0,0xA0,0xA0,0x90,0x00, + 5, // 0x4B 'K' + 0x00,0x90,0xA0,0xA0,0xC0,0xC0,0xA0,0xA0,0x90,0x00, - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, + 5, // 0x4C 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, - 5, // 0x4D 'M' - 0x00,0x90,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x00, + 5, // 0x4D 'M' + 0x00,0x90,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x00, - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00, + 5, // 0x4E 'N' + 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00, - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x4F 'O' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, + 5, // 0x50 'P' + 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, + 5, // 0x51 'Q' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, + 5, // 0x52 'R' + 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00, + 5, // 0x53 'S' + 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00, - 5, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 5, // 0x54 'T' + 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x55 'U' + 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x56 'V' - 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00, + 5, // 0x56 'V' + 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00, - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00, + 5, // 0x57 'W' + 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00, - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, + 5, // 0x58 'X' + 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - 5, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, + 5, // 0x59 'Y' + 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00, + 5, // 0x5A 'Z' + 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00, - 5, // 0x5B '[' - 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, + 5, // 0x5B '[' + 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - 5, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08, + 5, // 0x5C '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08, - 5, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, + 5, // 0x5D ']' + 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - 5, // 0x5E '^' - 0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x5E '^' + 0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, + 5, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x60 '`' + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, + 5, // 0x61 'a' + 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, - 5, // 0x62 'b' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, + 5, // 0x62 'b' + 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, + 5, // 0x63 'c' + 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, + 5, // 0x64 'd' + 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00, + 5, // 0x65 'e' + 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00, - 5, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, + 5, // 0x66 'f' + 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0xE0, + 5, // 0x67 'g' + 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0xE0, - 5, // 0x68 'h' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, + 5, // 0x68 'h' + 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x69 'i' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x6A 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xC0, + 5, // 0x6A 'j' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xC0, - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, + 5, // 0x6B 'k' + 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, - 5, // 0x6C 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, + 5, // 0x6C 'l' + 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - 5, // 0x6D 'm' - 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, + 5, // 0x6D 'm' + 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, + 5, // 0x6E 'n' + 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, + 5, // 0x6F 'o' + 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80, + 5, // 0x70 'p' + 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80, - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, + 5, // 0x71 'q' + 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, - 5, // 0x72 'r' - 0x00,0x00,0x00,0xB0,0x50,0x40,0x40,0x40,0xE0,0x00, + 5, // 0x72 'r' + 0x00,0x00,0x00,0xB0,0x50,0x40,0x40,0x40,0xE0,0x00, - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, + 5, // 0x73 's' + 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, - 5, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x50,0x20,0x00, + 5, // 0x74 't' + 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x50,0x20,0x00, - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, + 5, // 0x75 'u' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - 5, // 0x76 'v' - 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00, + 5, // 0x76 'v' + 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00, - 5, // 0x77 'w' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00, + 5, // 0x77 'w' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00, - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, + 5, // 0x78 'x' + 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, + 5, // 0x79 'y' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00, + 5, // 0x7A 'z' + 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00, - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, + 5, // 0x7B '{' + 0x30,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - 5, // 0x7C '|' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 5, // 0x7C '|' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, + 5, // 0x7D '}' + 0xC0,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x7E '~' + 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00, + 5, // 0x7F '' + 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs5x11_mono[] = - { - 11, 3, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, +const int8u mcs5x11_mono[] = +{ + 11, 3, 32, 128-32, + 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, + 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, + 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, + 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, + 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, + 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, + 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, + 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, + 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, + 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, + 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 5, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 5, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, + 5, // 0x23 '#' + 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, + 5, // 0x24 '$' + 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, + 5, // 0x25 '%' + 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00,0x00, + 5, // 0x26 '&' + 0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00,0x00, - 5, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, + 5, // 0x28 '(' + 0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - 5, // 0x29 ')' - 0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, + 5, // 0x29 ')' + 0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, + 5, // 0x2A '*' + 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, + 5, // 0x2B '+' + 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, + 5, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - 5, // 0x2F '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, + 5, // 0x2F '/' + 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, + 5, // 0x30 '0' + 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x31 '1' + 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, + 5, // 0x32 '2' + 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00,0x00, + 5, // 0x33 '3' + 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00,0x00, - 5, // 0x34 '4' - 0x00,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00, + 5, // 0x34 '4' + 0x00,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00, - 5, // 0x35 '5' - 0x00,0xF0,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00,0x00, + 5, // 0x35 '5' + 0x00,0xF0,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00,0x00, - 5, // 0x36 '6' - 0x00,0x60,0x90,0x80,0xE0,0x90,0x90,0x90,0x60,0x00,0x00, + 5, // 0x36 '6' + 0x00,0x60,0x90,0x80,0xE0,0x90,0x90,0x90,0x60,0x00,0x00, - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00, + 5, // 0x37 '7' + 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00, - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00,0x00, + 5, // 0x38 '8' + 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00,0x00, - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x90,0x60,0x00,0x00, + 5, // 0x39 '9' + 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x90,0x60,0x00,0x00, - 5, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, + 5, // 0x3A ':' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, - 5, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x40,0x80, + 5, // 0x3B ';' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x40,0x80, - 5, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, + 5, // 0x3C '<' + 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, + 5, // 0x3D '=' + 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, - 5, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, + 5, // 0x3E '>' + 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, + 5, // 0x3F '?' + 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00,0x00, + 5, // 0x40 '@' + 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00,0x00, - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00,0x00, + 5, // 0x41 'A' + 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00,0x00, - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00,0x00, + 5, // 0x42 'B' + 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00,0x00, - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00,0x00, + 5, // 0x43 'C' + 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00,0x00, - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, + 5, // 0x44 'D' + 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0xF0,0x00,0x00, + 5, // 0x45 'E' + 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0xF0,0x00,0x00, - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0x80,0x00,0x00, + 5, // 0x46 'F' + 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0x80,0x00,0x00, - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00,0x00, + 5, // 0x47 'G' + 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00,0x00, - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, + 5, // 0x48 'H' + 0x00,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00,0x00, + 5, // 0x4A 'J' + 0x00,0x70,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00,0x00, - 5, // 0x4B 'K' - 0x00,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00,0x00, + 5, // 0x4B 'K' + 0x00,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00,0x00, - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00,0x00, + 5, // 0x4C 'L' + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00,0x00, - 5, // 0x4D 'M' - 0x00,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, + 5, // 0x4D 'M' + 0x00,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00,0x00, + 5, // 0x4E 'N' + 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00,0x00, - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, + 5, // 0x4F 'O' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00,0x00, + 5, // 0x50 'P' + 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00,0x00, - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30,0x00, + 5, // 0x51 'Q' + 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30,0x00, - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00,0x00, + 5, // 0x52 'R' + 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00,0x00, - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00,0x00, + 5, // 0x53 'S' + 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00,0x00, - 5, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, + 5, // 0x54 'T' + 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, + 5, // 0x55 'U' + 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - 5, // 0x56 'V' - 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00,0x00, + 5, // 0x56 'V' + 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00,0x00, - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00,0x00, + 5, // 0x57 'W' + 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00,0x00, - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00,0x00, + 5, // 0x58 'X' + 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00,0x00, - 5, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00, + 5, // 0x59 'Y' + 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00, - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00,0x00, + 5, // 0x5A 'Z' + 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00,0x00, - 5, // 0x5B '[' - 0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, + 5, // 0x5B '[' + 0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - 5, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, + 5, // 0x5C '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - 5, // 0x5D ']' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, + 5, // 0x5D ']' + 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - 5, // 0x5E '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x5E '^' + 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00, + 5, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00, - 5, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x60 '`' + 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00,0x00, + 5, // 0x61 'a' + 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00,0x00, - 5, // 0x62 'b' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, + 5, // 0x62 'b' + 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00,0x00, + 5, // 0x63 'c' + 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00,0x00, - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00,0x00, + 5, // 0x64 'd' + 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00,0x00, - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00,0x00, + 5, // 0x65 'e' + 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00,0x00, - 5, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 5, // 0x66 'f' + 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, + 5, // 0x67 'g' + 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - 5, // 0x68 'h' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, + 5, // 0x68 'h' + 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x69 'i' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, + 5, // 0x6A 'j' + 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00,0x00, + 5, // 0x6B 'k' + 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00,0x00, - 5, // 0x6C 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x6C 'l' + 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x6D 'm' - 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, + 5, // 0x6D 'm' + 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, + 5, // 0x6E 'n' + 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00,0x00, + 5, // 0x6F 'o' + 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, + 5, // 0x70 'p' + 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, + 5, // 0x71 'q' + 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, - 5, // 0x72 'r' - 0x00,0x00,0x00,0xA0,0x50,0x40,0x40,0x40,0xE0,0x00,0x00, + 5, // 0x72 'r' + 0x00,0x00,0x00,0xA0,0x50,0x40,0x40,0x40,0xE0,0x00,0x00, - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00,0x00, + 5, // 0x73 's' + 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00,0x00, - 5, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, + 5, // 0x74 't' + 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00,0x00, + 5, // 0x75 'u' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00,0x00, - 5, // 0x76 'v' - 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00,0x00, + 5, // 0x76 'v' + 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00,0x00, - 5, // 0x77 'w' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00,0x00, + 5, // 0x77 'w' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00,0x00, - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00,0x00, + 5, // 0x78 'x' + 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00,0x00, - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, + 5, // 0x79 'y' + 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, + 5, // 0x7A 'z' + 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, + 5, // 0x7B '{' + 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - 5, // 0x7C '|' - 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00, + 5, // 0x7C '|' + 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00, - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, + 5, // 0x7D '}' + 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x7E '~' + 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, + 5, // 0x7F '' + 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs6x10_mono[] = - { - 10, 3, 32, 128-32, - 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, - 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, - 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, - 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, - 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, - 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, - 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, - 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, - 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, - 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, - 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, +const int8u mcs6x10_mono[] = +{ + 10, 3, 32, 128-32, + 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, + 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, + 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, + 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, + 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, + 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, + 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, + 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, + 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, + 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, + 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - 6, // 0x22 '"' - 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x22 '"' + 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00, + 6, // 0x23 '#' + 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00, - 6, // 0x24 '$' - 0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, + 6, // 0x24 '$' + 0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - 6, // 0x25 '%' - 0x00,0x08,0xC8,0xD0,0x10,0x20,0x2C,0x4C,0x40,0x00, + 6, // 0x25 '%' + 0x00,0x08,0xC8,0xD0,0x10,0x20,0x2C,0x4C,0x40,0x00, - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x24,0x54,0x48,0x34,0x00,0x00, + 6, // 0x26 '&' + 0x00,0x20,0x50,0x50,0x24,0x54,0x48,0x34,0x00,0x00, - 6, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x27 ''' + 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x10,0x10,0x08,0x00, + 6, // 0x28 '(' + 0x08,0x10,0x10,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - 6, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x10,0x10,0x20,0x00, + 6, // 0x29 ')' + 0x20,0x10,0x10,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00, + 6, // 0x2A '*' + 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00, - 6, // 0x2B '+' - 0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 6, // 0x2B '+' + 0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 6, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, + 6, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 6, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, + 6, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - 6, // 0x2F '/' - 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, + 6, // 0x2F '/' + 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - 6, // 0x30 '0' - 0x00,0x38,0x44,0x4C,0x54,0x64,0x44,0x38,0x00,0x00, + 6, // 0x30 '0' + 0x00,0x38,0x44,0x4C,0x54,0x64,0x44,0x38,0x00,0x00, - 6, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x31 '1' + 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x18,0x20,0x40,0x7C,0x00,0x00, + 6, // 0x32 '2' + 0x00,0x38,0x44,0x04,0x18,0x20,0x40,0x7C,0x00,0x00, - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x44,0x38,0x00,0x00, + 6, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x38,0x04,0x44,0x38,0x00,0x00, - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, + 6, // 0x34 '4' + 0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x04,0x44,0x38,0x00,0x00, + 6, // 0x35 '5' + 0x00,0x7C,0x40,0x40,0x78,0x04,0x44,0x38,0x00,0x00, - 6, // 0x36 '6' - 0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38,0x00,0x00, + 6, // 0x36 '6' + 0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38,0x00,0x00, - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x20,0x20,0x00,0x00, + 6, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x10,0x20,0x20,0x20,0x00,0x00, - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, + 6, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x38,0x00,0x00, + 6, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x38,0x00,0x00, - 6, // 0x3A ':' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, + 6, // 0x3A ':' + 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, - 6, // 0x3B ';' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, + 6, // 0x3B ';' + 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, - 6, // 0x3C '<' - 0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, + 6, // 0x3C '<' + 0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - 6, // 0x3D '=' - 0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, + 6, // 0x3D '=' + 0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - 6, // 0x3E '>' - 0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, + 6, // 0x3E '>' + 0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x18,0x10,0x00,0x10,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x18,0x10,0x00,0x10,0x00,0x00, - 6, // 0x40 '@' - 0x00,0x38,0x44,0x5C,0x54,0x5C,0x40,0x38,0x00,0x00, + 6, // 0x40 '@' + 0x00,0x38,0x44,0x5C,0x54,0x5C,0x40,0x38,0x00,0x00, - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x00,0x00, + 6, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x00,0x00, - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x78,0x00,0x00, + 6, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x78,0x00,0x00, - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 6, // 0x44 'D' - 0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, + 6, // 0x44 'D' + 0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x4C,0x44,0x44,0x3C,0x00,0x00, + 6, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x4C,0x44,0x44,0x3C,0x00,0x00, - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, + 6, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, - 6, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x49 'I' + 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, + 6, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x00,0x00, + 6, // 0x4D 'M' + 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x00,0x00, - 6, // 0x4E 'N' - 0x00,0x44,0x44,0x64,0x54,0x4C,0x44,0x44,0x00,0x00, + 6, // 0x4E 'N' + 0x00,0x44,0x44,0x64,0x54,0x4C,0x44,0x44,0x00,0x00, - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, + 6, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, + 6, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, + 6, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, + 6, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 6, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x00,0x00, + 6, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x00,0x00, - 6, // 0x57 'W' - 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x28,0x00,0x00, + 6, // 0x57 'W' + 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x28,0x00,0x00, - 6, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 6, // 0x58 'X' + 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x00,0x00, + 6, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x00,0x00, - 6, // 0x5A 'Z' - 0x00,0x78,0x08,0x10,0x20,0x40,0x40,0x78,0x00,0x00, + 6, // 0x5A 'Z' + 0x00,0x78,0x08,0x10,0x20,0x40,0x40,0x78,0x00,0x00, - 6, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, + 6, // 0x5B '[' + 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - 6, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, + 6, // 0x5C '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - 6, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, + 6, // 0x5D ']' + 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - 6, // 0x5E '^' - 0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x5E '^' + 0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - 6, // 0x60 '`' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x60 '`' + 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x3C,0x00,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x3C,0x00,0x00, - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x78,0x00,0x00, + 6, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x3C,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x3C,0x00,0x00, - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, + 6, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x78,0x40,0x3C,0x00,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x78,0x40,0x3C,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x0C,0x10,0x10,0x38,0x10,0x10,0x10,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x0C,0x10,0x10,0x38,0x10,0x10,0x10,0x00,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x38, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x38, - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x00,0x00, + 6, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x00,0x00, - 6, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x69 'i' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30, + 6, // 0x6A 'j' + 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30, - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, + 6, // 0x6B 'k' + 0x00,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, - 6, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x6C 'l' + 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x00,0x00, + 6, // 0x6D 'm' + 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x00,0x00, - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x00,0x00, + 6, // 0x6E 'n' + 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x00,0x00, - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40, + 6, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x04, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x04, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x70,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x70,0x00,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x40,0x38,0x04,0x78,0x00,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x38,0x40,0x38,0x04,0x78,0x00,0x00, - 6, // 0x74 't' - 0x00,0x10,0x10,0x38,0x10,0x10,0x14,0x08,0x00,0x00, + 6, // 0x74 't' + 0x00,0x10,0x10,0x38,0x10,0x10,0x14,0x08,0x00,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x00,0x00, - 6, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, + 6, // 0x77 'w' + 0x00,0x00,0x00,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x78,0x08,0x30,0x40,0x78,0x00,0x00, + 6, // 0x7A 'z' + 0x00,0x00,0x00,0x78,0x08,0x30,0x40,0x78,0x00,0x00, - 6, // 0x7B '{' - 0x18,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18,0x00, + 6, // 0x7B '{' + 0x18,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18,0x00, - 6, // 0x7C '|' - 0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, + 6, // 0x7C '|' + 0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, - 6, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60,0x00, + 6, // 0x7D '}' + 0x60,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60,0x00, - 6, // 0x7E '~' - 0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x7E '~' + 0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00, + 6, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs6x11_mono[] = - { - 11, 3, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, +const int8u mcs6x11_mono[] = +{ + 11, 3, 32, 128-32, + 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, + 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, + 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, + 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, + 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, + 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, + 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, + 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, + 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, + 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, + 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 6, // 0x22 '"' - 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x22 '"' + 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, + 6, // 0x23 '#' + 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, - 6, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, + 6, // 0x24 '$' + 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - 6, // 0x25 '%' - 0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, + 6, // 0x25 '%' + 0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, + 6, // 0x26 '&' + 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, - 6, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x27 ''' + 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, + 6, // 0x28 '(' + 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - 6, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, + 6, // 0x29 ')' + 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, + 6, // 0x2A '*' + 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, - 6, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 6, // 0x2B '+' + 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 6, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, + 6, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 6, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, + 6, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - 6, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, + 6, // 0x2F '/' + 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - 6, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00, + 6, // 0x30 '0' + 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - 6, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x31 '1' + 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 6, // 0x32 '2' + 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 6, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, + 6, // 0x34 '4' + 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, + 6, // 0x35 '5' + 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - 6, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x36 '6' + 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, + 6, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, + 6, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - 6, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, + 6, // 0x3A ':' + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, - 6, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, + 6, // 0x3B ';' + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, - 6, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, + 6, // 0x3C '<' + 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, + 6, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - 6, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, + 6, // 0x3E '>' + 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - 6, // 0x40 '@' - 0x00,0x38,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, + 6, // 0x40 '@' + 0x00,0x38,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, + 6, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, + 6, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 6, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, + 6, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x4C,0x34,0x00,0x00, + 6, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x4C,0x34,0x00,0x00, - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, + 6, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - 6, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x49 'I' + 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, + 6, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x54,0x44,0x44,0x44,0x00,0x00, + 6, // 0x4D 'M' + 0x00,0x44,0x6C,0x54,0x54,0x54,0x44,0x44,0x44,0x00,0x00, - 6, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00, + 6, // 0x4E 'N' + 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00, - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, + 6, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, + 6, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, + 6, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 6, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 6, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, + 6, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - 6, // 0x57 'W' - 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x54,0x28,0x00,0x00, + 6, // 0x57 'W' + 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x54,0x28,0x00,0x00, - 6, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, + 6, // 0x58 'X' + 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, + 6, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x5A 'Z' + 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, + 6, // 0x5B '[' + 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - 6, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, + 6, // 0x5C '\' + 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - 6, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, + 6, // 0x5D ']' + 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x5E '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - 6, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x60 '`' + 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, + 6, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, + 6, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 6, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 6, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x69 'i' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x6A 'j' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x50,0x20, + 6, // 0x6A 'j' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x50,0x20, - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00, + 6, // 0x6B 'k' + 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - 6, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 6, // 0x6C 'l' + 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 6, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x54,0x44,0x44,0x00,0x00, + 6, // 0x6D 'm' + 0x00,0x00,0x00,0x68,0x54,0x54,0x54,0x44,0x44,0x00,0x00, - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 6, // 0x6E 'n' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 6, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, + 6, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00, - 6, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x18,0x00,0x00, + 6, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - 6, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, + 6, // 0x77 'w' + 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 6, // 0x7A 'z' + 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 6, // 0x7B '{' - 0x18,0x20,0x20,0x20,0xC0,0xC0,0x20,0x20,0x20,0x18,0x00, + 6, // 0x7B '{' + 0x18,0x20,0x20,0x20,0xC0,0xC0,0x20,0x20,0x20,0x18,0x00, - 6, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, + 6, // 0x7C '|' + 0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, - 6, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x0C,0x0C,0x10,0x10,0x10,0x60,0x00, + 6, // 0x7D '}' + 0x60,0x10,0x10,0x10,0x0C,0x0C,0x10,0x10,0x10,0x60,0x00, - 6, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x7E '~' + 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, + 6, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs7x12_mono_high[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, - 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, - 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, - 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, +const int8u mcs7x12_mono_high[] = +{ + 12, 3, 32, 128-32, + 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, + 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, + 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, + 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, + 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, + 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, + 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, + 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, + 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, + 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, + 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x21 '!' - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, + 7, // 0x21 '!' + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - 7, // 0x22 '"' - 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x00, + 7, // 0x23 '#' + 0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x00, - 7, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, + 7, // 0x24 '$' + 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - 7, // 0x25 '%' - 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, + 7, // 0x25 '%' + 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, - 7, // 0x27 ''' - 0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x27 ''' + 0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, + 7, // 0x28 '(' + 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - 7, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, + 7, // 0x29 ')' + 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, + 7, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - 7, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 7, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 7, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, + 7, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, + 7, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - 7, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, + 7, // 0x2F '/' + 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00, + 7, // 0x3A ':' + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - 7, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x20,0x40, + 7, // 0x3B ';' + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - 7, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, + 7, // 0x3C '<' + 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, + 7, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - 7, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, + 7, // 0x3E '>' + 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - 7, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, + 7, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 7, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - 7, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, + 7, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x49 'I' + 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, + 7, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - 7, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, + 7, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - 7, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, + 7, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - 7, // 0x4D 'M' - 0x00,0x44,0x6C,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x4D 'M' + 0x00,0x44,0x6C,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, + 7, // 0x4E 'N' + 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, + 7, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, + 7, // 0x57 'W' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - 7, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, + 7, // 0x5A 'Z' + 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - 7, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, + 7, // 0x5B '[' + 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, + 7, // 0x5C '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - 7, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, + 7, // 0x5D ']' + 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - 7, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5E '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, + 7, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - 7, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x66 'f' + 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x69 'i' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30, + 7, // 0x6A 'j' + 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30, - 7, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, + 7, // 0x6B 'k' + 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - 7, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x6C 'l' + 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x6D 'm' + 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x6E 'n' + 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00, + 7, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 7, // 0x7A 'z' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 7, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, + 7, // 0x7B '{' + 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - 7, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, + 7, // 0x7C '|' + 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - 7, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, + 7, // 0x7D '}' + 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7E '~' + 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u mcs7x12_mono_low[] = - { - 12, 4, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, - 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, - 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, - 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, +const int8u mcs7x12_mono_low[] = +{ + 12, 4, 32, 128-32, + 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, + 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, + 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, + 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, + 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, + 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, + 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, + 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, + 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, + 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, + 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x21 '!' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, + 7, // 0x21 '!' + 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - 7, // 0x22 '"' - 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, + 7, // 0x23 '#' + 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, - 7, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00,0x00, + 7, // 0x24 '$' + 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00,0x00, - 7, // 0x25 '%' - 0x34,0x54,0x68,0x08,0x10,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, + 7, // 0x25 '%' + 0x34,0x54,0x68,0x08,0x10,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00,0x00, - 7, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x27 ''' + 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, + 7, // 0x28 '(' + 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - 7, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, + 7, // 0x29 ')' + 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, + 7, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - 7, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, + 7, // 0x2B '+' + 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - 7, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40,0x00, + 7, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40,0x00, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, + 7, // 0x2F '/' + 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x44,0x38,0x00,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x44,0x38,0x00,0x00,0x00, - 7, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 7, // 0x3A ':' + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40,0x00, + 7, // 0x3B ';' + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40,0x00, - 7, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, + 7, // 0x3C '<' + 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, + 7, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - 7, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, + 7, // 0x3E '>' + 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - 7, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, + 7, // 0x3F '?' + 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, + 7, // 0x40 '@' + 0x00,0x38,0x44,0x44,0x5C,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x41 'A' + 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, + 7, // 0x43 'C' + 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - 7, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 7, // 0x46 'F' + 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x4C,0x44,0x4C,0x34,0x00,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x38,0x44,0x40,0x40,0x4C,0x44,0x4C,0x34,0x00,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x49 'I' + 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, + 7, // 0x4A 'J' + 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - 7, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x00,0x00,0x00, + 7, // 0x4B 'K' + 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - 7, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x4C 'L' + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - 7, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x4D 'M' + 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00,0x00, + 7, // 0x4E 'N' + 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00,0x00, - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x4F 'O' + 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, + 7, // 0x51 'Q' + 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, + 7, // 0x56 'V' + 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, + 7, // 0x57 'W' + 0x00,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 7, // 0x5A 'Z' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x5A 'Z' + 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, - 7, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, + 7, // 0x5B '[' + 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, + 7, // 0x5C '\' + 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - 7, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, + 7, // 0x5D ']' + 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - 7, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5E '^' + 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, + 7, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, - 7, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + 7, // 0x66 'f' + 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x69 'i' + 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30, + 7, // 0x6A 'j' + 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30, - 7, // 0x6B 'k' - 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, + 7, // 0x6B 'k' + 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - 7, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, + 7, // 0x6C 'l' + 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - 7, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x6D 'm' + 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x00,0x00,0x00, + 7, // 0x6E 'n' + 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, + 7, // 0x6F 'o' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00,0x00, - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, + 7, // 0x74 't' + 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x7A 'z' + 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - 7, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, + 7, // 0x7B '{' + 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - 7, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, + 7, // 0x7C '|' + 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - 7, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, + 7, // 0x7D '}' + 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, - 7, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7E '~' + 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, + 7, // 0x7F '' + 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana12[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, - 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, - 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, - 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, - 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, - 0x61,0x02,0x7A,0x02,0x87,0x02,0xA0,0x02,0xAD,0x02,0xC6,0x02,0xD3,0x02,0xE0,0x02,0xED,0x02, - 0xFA,0x02,0x07,0x03,0x20,0x03,0x2D,0x03,0x3A,0x03,0x47,0x03,0x54,0x03,0x61,0x03,0x6E,0x03, - 0x7B,0x03,0x88,0x03,0x95,0x03,0xA2,0x03,0xAF,0x03,0xBC,0x03,0xC9,0x03,0xD6,0x03,0xE3,0x03, - 0xF0,0x03,0xFD,0x03,0x0A,0x04,0x17,0x04,0x24,0x04,0x31,0x04,0x4A,0x04,0x57,0x04,0x64,0x04, - 0x71,0x04,0x7E,0x04,0x8B,0x04,0x98,0x04,0xA5,0x04,0xB2,0x04,0xBF,0x04,0xCC,0x04,0xD9,0x04, - 0xE6,0x04,0xF3,0x04,0x00,0x05,0x0D,0x05,0x1A,0x05,0x27,0x05, +const int8u verdana12[] = +{ + 12, 3, 32, 128-32, + 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, + 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, + 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, + 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, + 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, + 0x61,0x02,0x7A,0x02,0x87,0x02,0xA0,0x02,0xAD,0x02,0xC6,0x02,0xD3,0x02,0xE0,0x02,0xED,0x02, + 0xFA,0x02,0x07,0x03,0x20,0x03,0x2D,0x03,0x3A,0x03,0x47,0x03,0x54,0x03,0x61,0x03,0x6E,0x03, + 0x7B,0x03,0x88,0x03,0x95,0x03,0xA2,0x03,0xAF,0x03,0xBC,0x03,0xC9,0x03,0xD6,0x03,0xE3,0x03, + 0xF0,0x03,0xFD,0x03,0x0A,0x04,0x17,0x04,0x24,0x04,0x31,0x04,0x4A,0x04,0x57,0x04,0x64,0x04, + 0x71,0x04,0x7E,0x04,0x8B,0x04,0x98,0x04,0xA5,0x04,0xB2,0x04,0xBF,0x04,0xCC,0x04,0xD9,0x04, + 0xE6,0x04,0xF3,0x04,0x00,0x05,0x0D,0x05,0x1A,0x05,0x27,0x05, - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 5, // 0x21 '!' + 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 5, // 0x22 '"' - 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00,0x00, + 7, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00,0x00, - 7, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3C,0x50,0x30,0x18,0x14,0x78,0x10,0x10, + 7, // 0x24 '$' + 0x00,0x00,0x10,0x10,0x3C,0x50,0x30,0x18,0x14,0x78,0x10,0x10, - 11, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x4A,0x00,0x4A,0x00,0x35,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, + 11, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x4A,0x00,0x4A,0x00,0x35,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x3A,0x00,0x00, + 7, // 0x26 '&' + 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x3A,0x00,0x00, - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x10, + 4, // 0x28 '(' + 0x00,0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - 4, // 0x29 ')' - 0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x80, + 4, // 0x29 ')' + 0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x80, - 7, // 0x2A '*' - 0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2A '*' + 0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 7, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 3, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00, + 3, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00, - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, + 5, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, - 3, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00, + 3, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00, - 4, // 0x2F '/' - 0x00,0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x80,0x00, + 4, // 0x2F '/' + 0x00,0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x80,0x00, - 7, // 0x30 '0' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x00,0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x00,0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7C,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7C,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x00,0x00,0x7C,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x00,0x00,0x7C,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x00,0x00,0x38,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x00,0x00,0x38,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x80,0x00, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x80,0x00, - 7, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x18,0x04,0x00,0x00,0x00, + 7, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x18,0x04,0x00,0x00,0x00, - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, + 7, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, - 7, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x30,0x40,0x00,0x00,0x00, + 7, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x30,0x40,0x00,0x00,0x00, - 6, // 0x3F '?' - 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x00,0x20,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x00,0x20,0x00,0x00, - 10, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1F,0x00,0x00,0x00, + 10, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1F,0x00,0x00,0x00, - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, + 8, // 0x41 'A' + 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x00,0x00,0x70,0x48,0x48,0x78,0x44,0x44,0x78,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x00,0x00,0x70,0x48,0x48,0x78,0x44,0x44,0x78,0x00,0x00, - 8, // 0x43 'C' - 0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00, + 8, // 0x43 'C' + 0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00, - 8, // 0x44 'D' - 0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x00,0x00, + 8, // 0x44 'D' + 0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, - 8, // 0x47 'G' - 0x00,0x00,0x00,0x1C,0x22,0x40,0x4E,0x42,0x22,0x1C,0x00,0x00, + 8, // 0x47 'G' + 0x00,0x00,0x00,0x1C,0x22,0x40,0x4E,0x42,0x22,0x1C,0x00,0x00, - 8, // 0x48 'H' - 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x00, + 8, // 0x48 'H' + 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, + 5, // 0x4A 'J' + 0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - 7, // 0x4B 'K' - 0x00,0x00,0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, + 7, // 0x4B 'K' + 0x00,0x00,0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - 9, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - 8, // 0x4E 'N' - 0x00,0x00,0x00,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x00, + 8, // 0x4E 'N' + 0x00,0x00,0x00,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x00, - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x00,0x00, - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, + 9, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, - 7, // 0x52 'R' - 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, - 7, // 0x53 'S' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, + 7, // 0x53 'S' + 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 8, // 0x55 'U' - 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, + 8, // 0x55 'U' + 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 8, // 0x56 'V' - 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, + 8, // 0x56 'V' + 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, - 9, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, + 9, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x00,0x00, - 7, // 0x5A 'Z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 7, // 0x5A 'Z' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 4, // 0x5B '[' - 0x00,0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, + 4, // 0x5B '[' + 0x00,0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - 4, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x00, + 4, // 0x5C '\' + 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x00, - 4, // 0x5D ']' - 0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, + 4, // 0x5D ']' + 0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - 7, // 0x5E '^' - 0x00,0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x5E '^' + 0x00,0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, - 6, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x60 '`' + 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x38,0x48,0x38,0x00,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x38,0x48,0x38,0x00,0x00, - 6, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, + 6, // 0x62 'b' + 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x40,0x40,0x38,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x40,0x40,0x38,0x00,0x00, - 6, // 0x64 'd' - 0x00,0x00,0x08,0x08,0x08,0x38,0x48,0x48,0x48,0x38,0x00,0x00, + 6, // 0x64 'd' + 0x00,0x00,0x08,0x08,0x08,0x38,0x48,0x48,0x48,0x38,0x00,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x00,0x00, + 4, // 0x66 'f' + 0x00,0x00,0x30,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x00,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x30, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x30, - 6, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x48,0x00,0x00, + 6, // 0x68 'h' + 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x48,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 3, // 0x6A 'j' - 0x00,0x00,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x80, + 3, // 0x6A 'j' + 0x00,0x00,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x80, - 6, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, + 6, // 0x6B 'k' + 0x00,0x00,0x40,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00, - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x48,0x00,0x00, + 6, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x48,0x00,0x00, - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, + 6, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x70,0x40,0x40, + 6, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x70,0x40,0x40, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x08, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x08, - 4, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x50,0x60,0x40,0x40,0x40,0x00,0x00, + 4, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x50,0x60,0x40,0x40,0x40,0x00,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x30,0x08,0x70,0x00,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x30,0x08,0x70,0x00,0x00, - 4, // 0x74 't' - 0x00,0x00,0x00,0x00,0x40,0xF0,0x40,0x40,0x40,0x30,0x00,0x00, + 4, // 0x74 't' + 0x00,0x00,0x00,0x00,0x40,0xF0,0x40,0x40,0x40,0x30,0x00,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x38,0x00,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x38,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x30,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x30,0x00,0x00, - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x44,0x54,0x54,0x28,0x28,0x00,0x00, + 7, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x44,0x54,0x54,0x28,0x28,0x00,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x10,0x20,0x20, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x10,0x20,0x20, - 5, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x70,0x10,0x20,0x40,0x70,0x00,0x00, + 5, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x70,0x10,0x20,0x40,0x70,0x00,0x00, - 6, // 0x7B '{' - 0x00,0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18, + 6, // 0x7B '{' + 0x00,0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18, - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 5, // 0x7C '|' + 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 6, // 0x7D '}' - 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60, + 6, // 0x7D '}' + 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60, - 7, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00, + 7, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00, - 9, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, + 9, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana12_bold[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, - 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, - 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, - 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, - 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, - 0x61,0x02,0x6E,0x02,0x7B,0x02,0x88,0x02,0x95,0x02,0xA2,0x02,0xAF,0x02,0xBC,0x02,0xC9,0x02, - 0xD6,0x02,0xE3,0x02,0xFC,0x02,0x09,0x03,0x16,0x03,0x23,0x03,0x30,0x03,0x3D,0x03,0x4A,0x03, - 0x57,0x03,0x64,0x03,0x71,0x03,0x7E,0x03,0x8B,0x03,0x98,0x03,0xA5,0x03,0xB2,0x03,0xBF,0x03, - 0xCC,0x03,0xD9,0x03,0xE6,0x03,0xF3,0x03,0x00,0x04,0x0D,0x04,0x26,0x04,0x33,0x04,0x40,0x04, - 0x4D,0x04,0x5A,0x04,0x67,0x04,0x74,0x04,0x81,0x04,0x8E,0x04,0x9B,0x04,0xB4,0x04,0xC1,0x04, - 0xCE,0x04,0xDB,0x04,0xE8,0x04,0xF5,0x04,0x02,0x05,0x0F,0x05, +const int8u verdana12_bold[] = +{ + 12, 3, 32, 128-32, + 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, + 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, + 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, + 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, + 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, + 0x61,0x02,0x6E,0x02,0x7B,0x02,0x88,0x02,0x95,0x02,0xA2,0x02,0xAF,0x02,0xBC,0x02,0xC9,0x02, + 0xD6,0x02,0xE3,0x02,0xFC,0x02,0x09,0x03,0x16,0x03,0x23,0x03,0x30,0x03,0x3D,0x03,0x4A,0x03, + 0x57,0x03,0x64,0x03,0x71,0x03,0x7E,0x03,0x8B,0x03,0x98,0x03,0xA5,0x03,0xB2,0x03,0xBF,0x03, + 0xCC,0x03,0xD9,0x03,0xE6,0x03,0xF3,0x03,0x00,0x04,0x0D,0x04,0x26,0x04,0x33,0x04,0x40,0x04, + 0x4D,0x04,0x5A,0x04,0x67,0x04,0x74,0x04,0x81,0x04,0x8E,0x04,0x9B,0x04,0xB4,0x04,0xC1,0x04, + 0xCE,0x04,0xDB,0x04,0xE8,0x04,0xF5,0x04,0x02,0x05,0x0F,0x05, - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, + 4, // 0x21 '!' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, - 5, // 0x22 '"' - 0x00,0x00,0xD8,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x00,0xD8,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x23 '#' - 0x00,0x00,0x00,0x14,0x14,0x7E,0x28,0xFC,0x50,0x50,0x00,0x00, + 8, // 0x23 '#' + 0x00,0x00,0x00,0x14,0x14,0x7E,0x28,0xFC,0x50,0x50,0x00,0x00, - 6, // 0x24 '$' - 0x00,0x00,0x20,0x20,0x70,0xE8,0xE0,0x38,0xB8,0x70,0x20,0x20, + 6, // 0x24 '$' + 0x00,0x00,0x20,0x20,0x70,0xE8,0xE0,0x38,0xB8,0x70,0x20,0x20, - 11, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x94,0x00,0x94,0x00,0x69,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, + 11, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x94,0x00,0x94,0x00,0x69,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, - 8, // 0x26 '&' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0x76,0xDC,0xCC,0x76,0x00,0x00, + 8, // 0x26 '&' + 0x00,0x00,0x00,0x70,0xD8,0xD8,0x76,0xDC,0xCC,0x76,0x00,0x00, - 3, // 0x27 ''' - 0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x00,0x00,0x30,0x60,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x60,0x30, + 5, // 0x28 '(' + 0x00,0x00,0x30,0x60,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x60,0x30, - 5, // 0x29 ')' - 0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0xC0, + 5, // 0x29 ')' + 0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0xC0, - 6, // 0x2A '*' - 0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2A '*' + 0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00,0x00,0x00,0x00, - 8, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, + 8, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - 3, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x80,0x00, + 3, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x80,0x00, - 4, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00, + 4, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00, - 3, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00, + 3, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00, - 6, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00, + 6, // 0x2F '/' + 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00, - 6, // 0x30 '0' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00, + 6, // 0x30 '0' + 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00, - 6, // 0x31 '1' - 0x00,0x00,0x00,0x30,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, + 6, // 0x31 '1' + 0x00,0x00,0x00,0x30,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - 6, // 0x32 '2' - 0x00,0x00,0x00,0x70,0x98,0x18,0x30,0x60,0xC0,0xF8,0x00,0x00, + 6, // 0x32 '2' + 0x00,0x00,0x00,0x70,0x98,0x18,0x30,0x60,0xC0,0xF8,0x00,0x00, - 6, // 0x33 '3' - 0x00,0x00,0x00,0x70,0x98,0x18,0x70,0x18,0x98,0x70,0x00,0x00, + 6, // 0x33 '3' + 0x00,0x00,0x00,0x70,0x98,0x18,0x70,0x18,0x98,0x70,0x00,0x00, - 6, // 0x34 '4' - 0x00,0x00,0x00,0x18,0x38,0x58,0x98,0xFC,0x18,0x18,0x00,0x00, + 6, // 0x34 '4' + 0x00,0x00,0x00,0x18,0x38,0x58,0x98,0xFC,0x18,0x18,0x00,0x00, - 6, // 0x35 '5' - 0x00,0x00,0x00,0xF8,0xC0,0xF0,0x18,0x18,0x98,0x70,0x00,0x00, + 6, // 0x35 '5' + 0x00,0x00,0x00,0xF8,0xC0,0xF0,0x18,0x18,0x98,0x70,0x00,0x00, - 6, // 0x36 '6' - 0x00,0x00,0x00,0x70,0xC0,0xF0,0xD8,0xD8,0xD8,0x70,0x00,0x00, + 6, // 0x36 '6' + 0x00,0x00,0x00,0x70,0xC0,0xF0,0xD8,0xD8,0xD8,0x70,0x00,0x00, - 6, // 0x37 '7' - 0x00,0x00,0x00,0xF8,0x18,0x30,0x30,0x60,0x60,0xC0,0x00,0x00, + 6, // 0x37 '7' + 0x00,0x00,0x00,0xF8,0x18,0x30,0x30,0x60,0x60,0xC0,0x00,0x00, - 6, // 0x38 '8' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0x70,0xD8,0xD8,0x70,0x00,0x00, + 6, // 0x38 '8' + 0x00,0x00,0x00,0x70,0xD8,0xD8,0x70,0xD8,0xD8,0x70,0x00,0x00, - 6, // 0x39 '9' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x78,0x18,0x70,0x00,0x00, + 6, // 0x39 '9' + 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x78,0x18,0x70,0x00,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x00,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x00,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x40,0x00, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x40,0x00, - 8, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x60,0x18,0x04,0x00,0x00, + 8, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x60,0x18,0x04,0x00,0x00, - 8, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, + 8, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, - 8, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x0C,0x30,0x40,0x00,0x00, + 8, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x0C,0x30,0x40,0x00,0x00, - 6, // 0x3F '?' - 0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x60,0x00,0x60,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x60,0x00,0x60,0x00,0x00, - 9, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x9D,0x00,0xA5,0x00,0xA5,0x00,0x9E,0x00,0x40,0x00,0x3C,0x00,0x00,0x00, + 9, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x9D,0x00,0xA5,0x00,0xA5,0x00,0x9E,0x00,0x40,0x00,0x3C,0x00,0x00,0x00, - 8, // 0x41 'A' - 0x00,0x00,0x00,0x38,0x38,0x6C,0x6C,0x7C,0xC6,0xC6,0x00,0x00, + 8, // 0x41 'A' + 0x00,0x00,0x00,0x38,0x38,0x6C,0x6C,0x7C,0xC6,0xC6,0x00,0x00, - 7, // 0x42 'B' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xCC,0xCC,0xF8,0x00,0x00, + 7, // 0x42 'B' + 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xCC,0xCC,0xF8,0x00,0x00, - 6, // 0x43 'C' - 0x00,0x00,0x00,0x70,0xC8,0xC0,0xC0,0xC0,0xC8,0x70,0x00,0x00, + 6, // 0x43 'C' + 0x00,0x00,0x00,0x70,0xC8,0xC0,0xC0,0xC0,0xC8,0x70,0x00,0x00, - 7, // 0x44 'D' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC,0xF8,0x00,0x00, + 7, // 0x44 'D' + 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC,0xF8,0x00,0x00, - 6, // 0x45 'E' - 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xF8,0x00,0x00, + 6, // 0x45 'E' + 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xF8,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xC0,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xC0,0x00,0x00, - 7, // 0x47 'G' - 0x00,0x00,0x00,0x78,0xC4,0xC0,0xC0,0xDC,0xCC,0x7C,0x00,0x00, + 7, // 0x47 'G' + 0x00,0x00,0x00,0x78,0xC4,0xC0,0xC0,0xDC,0xCC,0x7C,0x00,0x00, - 7, // 0x48 'H' - 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x00, + 7, // 0x48 'H' + 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0xF0,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0xF0,0x00,0x00, - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0xE0,0x00,0x00, + 5, // 0x4A 'J' + 0x00,0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0xE0,0x00,0x00, - 7, // 0x4B 'K' - 0x00,0x00,0x00,0xCC,0xD8,0xF0,0xE0,0xF0,0xD8,0xCC,0x00,0x00, + 7, // 0x4B 'K' + 0x00,0x00,0x00,0xCC,0xD8,0xF0,0xE0,0xF0,0xD8,0xCC,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xF8,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xF8,0x00,0x00, - 8, // 0x4D 'M' - 0x00,0x00,0x00,0x82,0xC6,0xEE,0xB6,0xB6,0x86,0x86,0x00,0x00, + 8, // 0x4D 'M' + 0x00,0x00,0x00,0x82,0xC6,0xEE,0xB6,0xB6,0x86,0x86,0x00,0x00, - 7, // 0x4E 'N' - 0x00,0x00,0x00,0x84,0xC4,0xE4,0xB4,0x9C,0x8C,0x84,0x00,0x00, + 7, // 0x4E 'N' + 0x00,0x00,0x00,0x84,0xC4,0xE4,0xB4,0x9C,0x8C,0x84,0x00,0x00, - 8, // 0x4F 'O' - 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00, + 8, // 0x4F 'O' + 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xF8,0xC0,0xC0,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xF8,0xC0,0xC0,0x00,0x00, - 8, // 0x51 'Q' - 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x18,0x0E, + 8, // 0x51 'Q' + 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x18,0x0E, - 7, // 0x52 'R' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xD8,0xCC,0xC6,0x00,0x00, + 7, // 0x52 'R' + 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xD8,0xCC,0xC6,0x00,0x00, - 6, // 0x53 'S' - 0x00,0x00,0x00,0x70,0xC8,0xC0,0x70,0x18,0x98,0x70,0x00,0x00, + 6, // 0x53 'S' + 0x00,0x00,0x00,0x70,0xC8,0xC0,0x70,0x18,0x98,0x70,0x00,0x00, - 6, // 0x54 'T' - 0x00,0x00,0x00,0xFC,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, + 6, // 0x54 'T' + 0x00,0x00,0x00,0xFC,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - 7, // 0x55 'U' - 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00, + 7, // 0x55 'U' + 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00, - 7, // 0x56 'V' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x78,0x78,0x30,0x30,0x00,0x00, + 7, // 0x56 'V' + 0x00,0x00,0x00,0xCC,0xCC,0x78,0x78,0x78,0x30,0x30,0x00,0x00, - 11, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xC0,0xCC,0xC0,0x6D,0x80,0x6D,0x80,0x73,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, + 11, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xC0,0xCC,0xC0,0x6D,0x80,0x6D,0x80,0x73,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, - 7, // 0x58 'X' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x78,0xCC,0xCC,0x00,0x00, + 7, // 0x58 'X' + 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x78,0xCC,0xCC,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x30,0x30,0x30,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x30,0x30,0x30,0x00,0x00, - 6, // 0x5A 'Z' - 0x00,0x00,0x00,0xF8,0x18,0x30,0x60,0xC0,0xC0,0xF8,0x00,0x00, + 6, // 0x5A 'Z' + 0x00,0x00,0x00,0xF8,0x18,0x30,0x60,0xC0,0xC0,0xF8,0x00,0x00, - 5, // 0x5B '[' - 0x00,0x00,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x70, + 5, // 0x5B '[' + 0x00,0x00,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x70, - 6, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00, + 6, // 0x5C '\' + 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00, - 5, // 0x5D ']' - 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70, + 5, // 0x5D ']' + 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70, - 8, // 0x5E '^' - 0x00,0x00,0x00,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x5E '^' + 0x00,0x00,0x00,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, + 6, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, - 6, // 0x60 '`' - 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x60 '`' + 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x70,0x18,0x78,0xD8,0x78,0x00,0x00, + 6, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x70,0x18,0x78,0xD8,0x78,0x00,0x00, - 6, // 0x62 'b' - 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xF0,0x00,0x00, + 6, // 0x62 'b' + 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xF0,0x00,0x00, - 5, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xC0,0xC0,0x70,0x00,0x00, + 5, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xC0,0xC0,0x70,0x00,0x00, - 6, // 0x64 'd' - 0x00,0x00,0x18,0x18,0x18,0x78,0xD8,0xD8,0xD8,0x78,0x00,0x00, + 6, // 0x64 'd' + 0x00,0x00,0x18,0x18,0x18,0x78,0xD8,0xD8,0xD8,0x78,0x00,0x00, - 6, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xF8,0xC0,0x78,0x00,0x00, + 6, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xF8,0xC0,0x78,0x00,0x00, - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x00,0x00, + 5, // 0x66 'f' + 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x00,0x00, - 6, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x70, + 6, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x70, - 6, // 0x68 'h' - 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, + 6, // 0x68 'h' + 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x00,0xC0,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x00,0xC0,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, - 4, // 0x6A 'j' - 0x00,0x00,0x00,0x60,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0xC0, + 4, // 0x6A 'j' + 0x00,0x00,0x00,0x60,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0xC0, - 6, // 0x6B 'k' - 0x00,0x00,0xC0,0xC0,0xC0,0xD8,0xD8,0xF0,0xD8,0xD8,0x00,0x00, + 6, // 0x6B 'k' + 0x00,0x00,0xC0,0xC0,0xC0,0xD8,0xD8,0xF0,0xD8,0xD8,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF6,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF6,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x00,0x00,0x00,0x00, - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, + 6, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x70,0x00,0x00, + 6, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x70,0x00,0x00, - 6, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xF0,0xC0,0xC0, + 6, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xF0,0xC0,0xC0, - 6, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x18, + 6, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x18, - 4, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0xD0,0xE0,0xC0,0xC0,0xC0,0x00,0x00, + 4, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0xD0,0xE0,0xC0,0xC0,0xC0,0x00,0x00, - 5, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xF0,0x30,0xE0,0x00,0x00, + 5, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xF0,0x30,0xE0,0x00,0x00, - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x38,0x00,0x00, + 5, // 0x74 't' + 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x38,0x00,0x00, - 6, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0xD8,0x78,0x00,0x00, + 6, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0xD8,0x78,0x00,0x00, - 6, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x00,0x00, + 6, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x00,0x00, - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00, + 9, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00, - 6, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x70,0xD8,0xD8,0x00,0x00, + 6, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x70,0xD8,0xD8,0x00,0x00, - 6, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x30,0x60, + 6, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x30,0x60, - 5, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x30,0x60,0xC0,0xF0,0x00,0x00, + 5, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0xF0,0x30,0x60,0xC0,0xF0,0x00,0x00, - 6, // 0x7B '{' - 0x00,0x00,0x18,0x30,0x30,0x30,0xE0,0x30,0x30,0x30,0x30,0x18, + 6, // 0x7B '{' + 0x00,0x00,0x18,0x30,0x30,0x30,0xE0,0x30,0x30,0x30,0x30,0x18, - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 5, // 0x7C '|' + 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 6, // 0x7D '}' - 0x00,0x00,0xC0,0x60,0x60,0x60,0x38,0x60,0x60,0x60,0x60,0xC0, + 6, // 0x7D '}' + 0x00,0x00,0xC0,0x60,0x60,0x60,0x38,0x60,0x60,0x60,0x60,0xC0, - 8, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x92,0x8C,0x00,0x00,0x00, + 8, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x92,0x8C,0x00,0x00,0x00, - 9, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, + 9, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana13[] = - { - 13, 3, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x7C,0x00,0x8A,0x00, - 0x98,0x00,0xA6,0x00,0xB4,0x00,0xCF,0x00,0xDD,0x00,0xEB,0x00,0xF9,0x00,0x07,0x01,0x15,0x01, - 0x23,0x01,0x31,0x01,0x3F,0x01,0x4D,0x01,0x5B,0x01,0x69,0x01,0x77,0x01,0x85,0x01,0x93,0x01, - 0xA1,0x01,0xAF,0x01,0xCA,0x01,0xE5,0x01,0x00,0x02,0x0E,0x02,0x29,0x02,0x37,0x02,0x45,0x02, - 0x60,0x02,0x7B,0x02,0x89,0x02,0x97,0x02,0xB2,0x02,0xC0,0x02,0xCE,0x02,0xDC,0x02,0xEA,0x02, - 0xF8,0x02,0x13,0x03,0x21,0x03,0x3C,0x03,0x4A,0x03,0x65,0x03,0x73,0x03,0x81,0x03,0x8F,0x03, - 0x9D,0x03,0xAB,0x03,0xC6,0x03,0xD4,0x03,0xE2,0x03,0xF0,0x03,0xFE,0x03,0x0C,0x04,0x1A,0x04, - 0x35,0x04,0x43,0x04,0x51,0x04,0x5F,0x04,0x6D,0x04,0x7B,0x04,0x89,0x04,0x97,0x04,0xA5,0x04, - 0xB3,0x04,0xC1,0x04,0xCF,0x04,0xDD,0x04,0xEB,0x04,0xF9,0x04,0x14,0x05,0x22,0x05,0x30,0x05, - 0x3E,0x05,0x4C,0x05,0x5A,0x05,0x68,0x05,0x76,0x05,0x84,0x05,0x92,0x05,0xAD,0x05,0xBB,0x05, - 0xC9,0x05,0xD7,0x05,0xE5,0x05,0xF3,0x05,0x01,0x06,0x1C,0x06, +const int8u verdana13[] = +{ + 13, 3, 32, 128-32, + 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x7C,0x00,0x8A,0x00, + 0x98,0x00,0xA6,0x00,0xB4,0x00,0xCF,0x00,0xDD,0x00,0xEB,0x00,0xF9,0x00,0x07,0x01,0x15,0x01, + 0x23,0x01,0x31,0x01,0x3F,0x01,0x4D,0x01,0x5B,0x01,0x69,0x01,0x77,0x01,0x85,0x01,0x93,0x01, + 0xA1,0x01,0xAF,0x01,0xCA,0x01,0xE5,0x01,0x00,0x02,0x0E,0x02,0x29,0x02,0x37,0x02,0x45,0x02, + 0x60,0x02,0x7B,0x02,0x89,0x02,0x97,0x02,0xB2,0x02,0xC0,0x02,0xCE,0x02,0xDC,0x02,0xEA,0x02, + 0xF8,0x02,0x13,0x03,0x21,0x03,0x3C,0x03,0x4A,0x03,0x65,0x03,0x73,0x03,0x81,0x03,0x8F,0x03, + 0x9D,0x03,0xAB,0x03,0xC6,0x03,0xD4,0x03,0xE2,0x03,0xF0,0x03,0xFE,0x03,0x0C,0x04,0x1A,0x04, + 0x35,0x04,0x43,0x04,0x51,0x04,0x5F,0x04,0x6D,0x04,0x7B,0x04,0x89,0x04,0x97,0x04,0xA5,0x04, + 0xB3,0x04,0xC1,0x04,0xCF,0x04,0xDD,0x04,0xEB,0x04,0xF9,0x04,0x14,0x05,0x22,0x05,0x30,0x05, + 0x3E,0x05,0x4C,0x05,0x5A,0x05,0x68,0x05,0x76,0x05,0x84,0x05,0x92,0x05,0xAD,0x05,0xBB,0x05, + 0xC9,0x05,0xD7,0x05,0xE5,0x05,0xF3,0x05,0x01,0x06,0x1C,0x06, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 4, // 0x21 '!' + 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 5, // 0x22 '"' - 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, + 9, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, - 7, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3C,0x50,0x50,0x38,0x14,0x14,0x78,0x10,0x10, + 7, // 0x24 '$' + 0x00,0x00,0x10,0x10,0x3C,0x50,0x50,0x38,0x14,0x14,0x78,0x10,0x10, - 12, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x4A,0x00,0x32,0x00,0x04,0xC0,0x05,0x20,0x09,0x20,0x08,0xC0,0x00,0x00,0x00,0x00, + 12, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x4A,0x00,0x32,0x00,0x04,0xC0,0x05,0x20,0x09,0x20,0x08,0xC0,0x00,0x00,0x00,0x00, - 8, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x46,0x39,0x00,0x00, + 8, // 0x26 '&' + 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x46,0x39,0x00,0x00, - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, + 5, // 0x28 '(' + 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - 5, // 0x29 ')' - 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, + 5, // 0x29 ')' + 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, + 5, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - 5, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, + 5, // 0x2F '/' + 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - 7, // 0x30 '0' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x30 '0' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x31 '1' - 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, + 7, // 0x31 '1' + 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 7, // 0x32 '2' - 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 7, // 0x32 '2' + 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 7, // 0x33 '3' - 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x33 '3' + 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x34 '4' - 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x88,0xFC,0x08,0x08,0x00,0x00, + 7, // 0x34 '4' + 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x88,0xFC,0x08,0x08,0x00,0x00, - 7, // 0x35 '5' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, + 7, // 0x35 '5' + 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - 7, // 0x36 '6' - 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x36 '6' + 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x37 '7' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, + 7, // 0x37 '7' + 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - 7, // 0x38 '8' - 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x38 '8' + 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x39 '9' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, + 7, // 0x39 '9' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00, + 5, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00, - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x40, + 5, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x40, - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x3F '?' - 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, + 6, // 0x3F '?' + 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - 10, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1E,0x00,0x00,0x00, + 10, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1E,0x00,0x00,0x00, - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, + 8, // 0x41 'A' + 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, - 8, // 0x42 'B' - 0x00,0x00,0x00,0x78,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, + 8, // 0x42 'B' + 0x00,0x00,0x00,0x78,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 7, // 0x45 'E' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C,0x00,0x00, + 7, // 0x45 'E' + 0x00,0x00,0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C,0x00,0x00, - 6, // 0x46 'F' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, + 6, // 0x46 'F' + 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - 8, // 0x48 'H' - 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x00,0x00, + 8, // 0x48 'H' + 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, + 5, // 0x4A 'J' + 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00, + 8, // 0x4B 'K' + 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00, - 6, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, + 6, // 0x4C 'L' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - 9, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - 8, // 0x4E 'N' - 0x00,0x00,0x00,0x62,0x62,0x52,0x52,0x4A,0x4A,0x46,0x46,0x00,0x00, + 8, // 0x4E 'N' + 0x00,0x00,0x00,0x62,0x62,0x52,0x52,0x4A,0x4A,0x46,0x46,0x00,0x00, - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - 7, // 0x50 'P' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, + 7, // 0x50 'P' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, + 9, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, - 8, // 0x52 'R' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x42,0x00,0x00, + 8, // 0x52 'R' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x42,0x00,0x00, - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00, + 8, // 0x53 'S' + 0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 8, // 0x55 'U' - 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, + 8, // 0x55 'U' + 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 8, // 0x56 'V' - 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00, + 8, // 0x56 'V' + 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00, - 11, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, + 11, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, - 8, // 0x58 'X' - 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x00,0x00, + 8, // 0x58 'X' + 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x00,0x00,0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00, + 8, // 0x5A 'Z' + 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00, - 5, // 0x5B '[' - 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, + 5, // 0x5B '[' + 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - 5, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, + 5, // 0x5C '\' + 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - 5, // 0x5D ']' - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, + 5, // 0x5D ']' + 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - 9, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE, + 7, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE, - 7, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x60 '`' + 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, + 7, // 0x62 'b' + 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - 7, // 0x64 'd' - 0x00,0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x64 'd' + 0x00,0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, + 7, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 4, // 0x66 'f' + 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, + 7, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, - 7, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x68 'h' + 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 4, // 0x6A 'j' - 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, + 4, // 0x6A 'j' + 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - 7, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x70,0x48,0x44,0x00,0x00, + 7, // 0x6B 'k' + 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x70,0x48,0x44,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, + 11, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, + 7, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, + 7, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, + 7, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, + 7, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x00,0x00, + 5, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x00,0x00, - 6, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x60,0x18,0x08,0x70,0x00,0x00, + 6, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x60,0x18,0x08,0x70,0x00,0x00, - 4, // 0x74 't' - 0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, + 4, // 0x74 't' + 0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, + 7, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, + 9, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x10,0x28,0x44,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x10,0x28,0x44,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x10,0x20,0x40,0x78,0x00,0x00, + 6, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x10,0x20,0x40,0x78,0x00,0x00, - 7, // 0x7B '{' - 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0C, + 7, // 0x7B '{' + 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0C, - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 5, // 0x7C '|' + 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 7, // 0x7D '}' - 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60, + 7, // 0x7D '}' + 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60, - 9, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, + 11, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana13_bold[] = - { - 13, 3, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x89,0x00,0x97,0x00, - 0xA5,0x00,0xB3,0x00,0xC1,0x00,0xDC,0x00,0xEA,0x00,0xF8,0x00,0x06,0x01,0x14,0x01,0x22,0x01, - 0x30,0x01,0x3E,0x01,0x4C,0x01,0x5A,0x01,0x68,0x01,0x76,0x01,0x84,0x01,0x92,0x01,0xA0,0x01, - 0xAE,0x01,0xBC,0x01,0xD7,0x01,0xF2,0x01,0x0D,0x02,0x1B,0x02,0x36,0x02,0x51,0x02,0x5F,0x02, - 0x6D,0x02,0x88,0x02,0x96,0x02,0xA4,0x02,0xBF,0x02,0xDA,0x02,0xE8,0x02,0xF6,0x02,0x04,0x03, - 0x12,0x03,0x2D,0x03,0x48,0x03,0x63,0x03,0x71,0x03,0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03, - 0xD1,0x03,0xDF,0x03,0xFA,0x03,0x08,0x04,0x16,0x04,0x24,0x04,0x32,0x04,0x40,0x04,0x4E,0x04, - 0x69,0x04,0x77,0x04,0x85,0x04,0x93,0x04,0xA1,0x04,0xAF,0x04,0xBD,0x04,0xCB,0x04,0xD9,0x04, - 0xE7,0x04,0xF5,0x04,0x03,0x05,0x11,0x05,0x1F,0x05,0x2D,0x05,0x48,0x05,0x56,0x05,0x64,0x05, - 0x72,0x05,0x80,0x05,0x8E,0x05,0x9C,0x05,0xAA,0x05,0xB8,0x05,0xC6,0x05,0xE1,0x05,0xEF,0x05, - 0xFD,0x05,0x0B,0x06,0x19,0x06,0x27,0x06,0x35,0x06,0x50,0x06, +const int8u verdana13_bold[] = +{ + 13, 3, 32, 128-32, + 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x89,0x00,0x97,0x00, + 0xA5,0x00,0xB3,0x00,0xC1,0x00,0xDC,0x00,0xEA,0x00,0xF8,0x00,0x06,0x01,0x14,0x01,0x22,0x01, + 0x30,0x01,0x3E,0x01,0x4C,0x01,0x5A,0x01,0x68,0x01,0x76,0x01,0x84,0x01,0x92,0x01,0xA0,0x01, + 0xAE,0x01,0xBC,0x01,0xD7,0x01,0xF2,0x01,0x0D,0x02,0x1B,0x02,0x36,0x02,0x51,0x02,0x5F,0x02, + 0x6D,0x02,0x88,0x02,0x96,0x02,0xA4,0x02,0xBF,0x02,0xDA,0x02,0xE8,0x02,0xF6,0x02,0x04,0x03, + 0x12,0x03,0x2D,0x03,0x48,0x03,0x63,0x03,0x71,0x03,0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03, + 0xD1,0x03,0xDF,0x03,0xFA,0x03,0x08,0x04,0x16,0x04,0x24,0x04,0x32,0x04,0x40,0x04,0x4E,0x04, + 0x69,0x04,0x77,0x04,0x85,0x04,0x93,0x04,0xA1,0x04,0xAF,0x04,0xBD,0x04,0xCB,0x04,0xD9,0x04, + 0xE7,0x04,0xF5,0x04,0x03,0x05,0x11,0x05,0x1F,0x05,0x2D,0x05,0x48,0x05,0x56,0x05,0x64,0x05, + 0x72,0x05,0x80,0x05,0x8E,0x05,0x9C,0x05,0xAA,0x05,0xB8,0x05,0xC6,0x05,0xE1,0x05,0xEF,0x05, + 0xFD,0x05,0x0B,0x06,0x19,0x06,0x27,0x06,0x35,0x06,0x50,0x06, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, + 4, // 0x21 '!' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, + 9, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, - 8, // 0x24 '$' - 0x00,0x00,0x08,0x08,0x3C,0x6A,0x68,0x3C,0x16,0x56,0x3C,0x10,0x10, + 8, // 0x24 '$' + 0x00,0x00,0x08,0x08,0x3C,0x6A,0x68,0x3C,0x16,0x56,0x3C,0x10,0x10, - 14, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x80,0x6C,0x80,0x6D,0x00,0x6D,0x70,0x3A,0xD8,0x02,0xD8,0x04,0xD8,0x04,0x70,0x00,0x00,0x00,0x00, + 14, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x80,0x6C,0x80,0x6D,0x00,0x6D,0x70,0x3A,0xD8,0x02,0xD8,0x04,0xD8,0x04,0x70,0x00,0x00,0x00,0x00, - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, + 10, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, - 4, // 0x27 ''' - 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, + 6, // 0x28 '(' + 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, - 6, // 0x29 ')' - 0x00,0x00,0x60,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x30,0x60, + 6, // 0x29 ')' + 0x00,0x00,0x60,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x30,0x60, - 8, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - 8, // 0x2F '/' - 0x00,0x00,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x60,0x60, + 8, // 0x2F '/' + 0x00,0x00,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x60,0x60, - 8, // 0x30 '0' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, + 8, // 0x30 '0' + 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - 8, // 0x31 '1' - 0x00,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00, + 8, // 0x31 '1' + 0x00,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00, - 8, // 0x32 '2' - 0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00, + 8, // 0x32 '2' + 0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00, - 8, // 0x33 '3' - 0x00,0x00,0x00,0x3C,0x66,0x06,0x1C,0x06,0x06,0x66,0x3C,0x00,0x00, + 8, // 0x33 '3' + 0x00,0x00,0x00,0x3C,0x66,0x06,0x1C,0x06,0x06,0x66,0x3C,0x00,0x00, - 8, // 0x34 '4' - 0x00,0x00,0x00,0x04,0x0C,0x1C,0x2C,0x4C,0x7E,0x0C,0x0C,0x00,0x00, + 8, // 0x34 '4' + 0x00,0x00,0x00,0x04,0x0C,0x1C,0x2C,0x4C,0x7E,0x0C,0x0C,0x00,0x00, - 8, // 0x35 '5' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x3C,0x06,0x06,0x66,0x3C,0x00,0x00, + 8, // 0x35 '5' + 0x00,0x00,0x00,0x3E,0x30,0x30,0x3C,0x06,0x06,0x66,0x3C,0x00,0x00, - 8, // 0x36 '6' - 0x00,0x00,0x00,0x1C,0x30,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00,0x00, + 8, // 0x36 '6' + 0x00,0x00,0x00,0x1C,0x30,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00,0x00, - 8, // 0x37 '7' - 0x00,0x00,0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x00,0x00, + 8, // 0x37 '7' + 0x00,0x00,0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x00,0x00, - 8, // 0x38 '8' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C,0x00,0x00, + 8, // 0x38 '8' + 0x00,0x00,0x00,0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C,0x00,0x00, - 8, // 0x39 '9' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00,0x00, + 8, // 0x39 '9' + 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00,0x00, - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, + 4, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x40, + 4, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x40, - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x00,0x00, + 7, // 0x3F '?' + 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x00,0x00, - 11, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x4F,0x40,0x5B,0x40,0x5B,0x40,0x5B,0x40,0x4F,0x80,0x20,0x00,0x1F,0x00,0x00,0x00, + 11, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x4F,0x40,0x5B,0x40,0x5B,0x40,0x5B,0x40,0x4F,0x80,0x20,0x00,0x1F,0x00,0x00,0x00, - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, + 9, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - 8, // 0x42 'B' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x7C,0x00,0x00, + 8, // 0x42 'B' + 0x00,0x00,0x00,0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x7C,0x00,0x00, - 8, // 0x43 'C' - 0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, + 8, // 0x43 'C' + 0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, + 8, // 0x45 'E' + 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, - 8, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, + 8, // 0x46 'F' + 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x60,0x00,0x67,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, + 9, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x60,0x00,0x67,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, + 9, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - 6, // 0x49 'I' - 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, + 6, // 0x49 'I' + 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0xF0,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0xF0,0x00,0x00, - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x66,0x6C,0x78,0x70,0x70,0x78,0x6C,0x66,0x00,0x00, + 8, // 0x4B 'K' + 0x00,0x00,0x00,0x66,0x6C,0x78,0x70,0x70,0x78,0x6C,0x66,0x00,0x00, - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00, + 7, // 0x4C 'L' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00, - 10, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x71,0x80,0x7B,0x80,0x5D,0x80,0x49,0x80,0x41,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00, + 10, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x71,0x80,0x7B,0x80,0x5D,0x80,0x49,0x80,0x41,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00, - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x61,0x00,0x71,0x00,0x59,0x00,0x4D,0x00,0x47,0x00,0x43,0x00,0x41,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x61,0x00,0x71,0x00,0x59,0x00,0x4D,0x00,0x47,0x00,0x43,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 8, // 0x50 'P' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00,0x00, + 8, // 0x50 'P' + 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00,0x00, - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x0C,0x00,0x07,0x00, + 9, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x0C,0x00,0x07,0x00, - 8, // 0x52 'R' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x6C,0x66,0x63,0x00,0x00, + 8, // 0x52 'R' + 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x6C,0x66,0x63,0x00,0x00, - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00, + 8, // 0x53 'S' + 0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00, - 8, // 0x54 'T' - 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, + 8, // 0x54 'T' + 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 8, // 0x56 'V' - 0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x00, + 8, // 0x56 'V' + 0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x00, - 12, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x36,0xC0,0x3F,0xC0,0x39,0xC0,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00, + 12, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x36,0xC0,0x3F,0xC0,0x39,0xC0,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00, - 8, // 0x58 'X' - 0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x18,0x3C,0x66,0x66,0x00,0x00, + 8, // 0x58 'X' + 0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x18,0x3C,0x66,0x66,0x00,0x00, - 8, // 0x59 'Y' - 0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x18,0x18,0x00,0x00, + 8, // 0x59 'Y' + 0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x18,0x18,0x00,0x00, - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x06,0x0E,0x1C,0x38,0x70,0x60,0x7E,0x00,0x00, + 8, // 0x5A 'Z' + 0x00,0x00,0x00,0x7E,0x06,0x0E,0x1C,0x38,0x70,0x60,0x7E,0x00,0x00, - 6, // 0x5B '[' - 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, + 6, // 0x5B '[' + 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, - 8, // 0x5C '\' - 0x00,0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x18,0x0C,0x0C,0x06,0x06, + 8, // 0x5C '\' + 0x00,0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x18,0x0C,0x0C,0x06,0x06, - 6, // 0x5D ']' - 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, + 6, // 0x5D ']' + 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, + 8, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, - 8, // 0x60 '`' - 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x60 '`' + 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00, - 8, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, + 8, // 0x62 'b' + 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x60,0x60,0x3C,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x60,0x60,0x3C,0x00,0x00, - 8, // 0x64 'd' - 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, + 8, // 0x64 'd' + 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 5, // 0x66 'f' + 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, + 8, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, - 8, // 0x68 'h' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, + 8, // 0x68 'h' + 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 4, // 0x69 'i' + 0x00,0x00,0x00,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, + 5, // 0x6A 'j' + 0x00,0x00,0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - 8, // 0x6B 'k' - 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x00,0x00, + 8, // 0x6B 'k' + 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x00,0x00, - 4, // 0x6C 'l' - 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 4, // 0x6C 'l' + 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 12, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xC0,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, + 12, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xC0,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, + 8, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, + 8, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, + 8, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, + 8, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x78,0x3C,0x0C,0x78,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x78,0x3C,0x0C,0x78,0x00,0x00, - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x38,0x00,0x00, + 5, // 0x74 't' + 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x38,0x00,0x00, - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, + 8, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x18,0x00,0x00, + 8, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x18,0x00,0x00, - 10, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, + 10, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x66,0x66,0x00,0x00, + 8, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x66,0x66,0x00,0x00, - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x30,0x30, + 8, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x30,0x30, - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x30,0x60,0x7C,0x00,0x00, + 7, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x30,0x60,0x7C,0x00,0x00, - 8, // 0x7B '{' - 0x00,0x00,0x0E,0x18,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E, + 8, // 0x7B '{' + 0x00,0x00,0x0E,0x18,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E, - 6, // 0x7C '|' - 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 6, // 0x7C '|' + 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 8, // 0x7D '}' - 0x00,0x00,0x70,0x18,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70, + 8, // 0x7D '}' + 0x00,0x00,0x70,0x18,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70, - 9, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, + 11, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana14[] = - { - 14, 3, 32, 128-32, - 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x59,0x00,0x76,0x00,0x93,0x00,0xA2,0x00, - 0xB1,0x00,0xC0,0x00,0xCF,0x00,0xEC,0x00,0xFB,0x00,0x0A,0x01,0x19,0x01,0x28,0x01,0x37,0x01, - 0x46,0x01,0x55,0x01,0x64,0x01,0x73,0x01,0x82,0x01,0x91,0x01,0xA0,0x01,0xAF,0x01,0xBE,0x01, - 0xCD,0x01,0xDC,0x01,0xF9,0x01,0x16,0x02,0x33,0x02,0x42,0x02,0x5F,0x02,0x6E,0x02,0x7D,0x02, - 0x9A,0x02,0xB7,0x02,0xC6,0x02,0xD5,0x02,0xF2,0x02,0x0F,0x03,0x1E,0x03,0x2D,0x03,0x3C,0x03, - 0x4B,0x03,0x68,0x03,0x85,0x03,0xA2,0x03,0xB1,0x03,0xCE,0x03,0xDD,0x03,0xEC,0x03,0xFB,0x03, - 0x18,0x04,0x27,0x04,0x44,0x04,0x53,0x04,0x62,0x04,0x71,0x04,0x80,0x04,0x8F,0x04,0x9E,0x04, - 0xBB,0x04,0xCA,0x04,0xD9,0x04,0xE8,0x04,0xF7,0x04,0x06,0x05,0x15,0x05,0x24,0x05,0x33,0x05, - 0x42,0x05,0x51,0x05,0x60,0x05,0x6F,0x05,0x7E,0x05,0x8D,0x05,0xAA,0x05,0xB9,0x05,0xC8,0x05, - 0xD7,0x05,0xE6,0x05,0xF5,0x05,0x04,0x06,0x13,0x06,0x22,0x06,0x31,0x06,0x4E,0x06,0x5D,0x06, - 0x6C,0x06,0x7B,0x06,0x8A,0x06,0x99,0x06,0xA8,0x06,0xC5,0x06, +const int8u verdana14[] = +{ + 14, 3, 32, 128-32, + 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x59,0x00,0x76,0x00,0x93,0x00,0xA2,0x00, + 0xB1,0x00,0xC0,0x00,0xCF,0x00,0xEC,0x00,0xFB,0x00,0x0A,0x01,0x19,0x01,0x28,0x01,0x37,0x01, + 0x46,0x01,0x55,0x01,0x64,0x01,0x73,0x01,0x82,0x01,0x91,0x01,0xA0,0x01,0xAF,0x01,0xBE,0x01, + 0xCD,0x01,0xDC,0x01,0xF9,0x01,0x16,0x02,0x33,0x02,0x42,0x02,0x5F,0x02,0x6E,0x02,0x7D,0x02, + 0x9A,0x02,0xB7,0x02,0xC6,0x02,0xD5,0x02,0xF2,0x02,0x0F,0x03,0x1E,0x03,0x2D,0x03,0x3C,0x03, + 0x4B,0x03,0x68,0x03,0x85,0x03,0xA2,0x03,0xB1,0x03,0xCE,0x03,0xDD,0x03,0xEC,0x03,0xFB,0x03, + 0x18,0x04,0x27,0x04,0x44,0x04,0x53,0x04,0x62,0x04,0x71,0x04,0x80,0x04,0x8F,0x04,0x9E,0x04, + 0xBB,0x04,0xCA,0x04,0xD9,0x04,0xE8,0x04,0xF7,0x04,0x06,0x05,0x15,0x05,0x24,0x05,0x33,0x05, + 0x42,0x05,0x51,0x05,0x60,0x05,0x6F,0x05,0x7E,0x05,0x8D,0x05,0xAA,0x05,0xB9,0x05,0xC8,0x05, + 0xD7,0x05,0xE6,0x05,0xF5,0x05,0x04,0x06,0x13,0x06,0x22,0x06,0x31,0x06,0x4E,0x06,0x5D,0x06, + 0x6C,0x06,0x7B,0x06,0x8A,0x06,0x99,0x06,0xA8,0x06,0xC5,0x06, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, + 5, // 0x21 '!' + 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - 6, // 0x22 '"' - 0x00,0x00,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x22 '"' + 0x00,0x00,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x12,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, + 10, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x12,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, - 8, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10, + 8, // 0x24 '$' + 0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10, - 13, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x49,0x00,0x49,0x00,0x4A,0x00,0x32,0x60,0x02,0x90,0x04,0x90,0x04,0x90,0x08,0x60,0x00,0x00,0x00,0x00, + 13, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x49,0x00,0x49,0x00,0x4A,0x00,0x32,0x60,0x02,0x90,0x04,0x90,0x04,0x90,0x08,0x60,0x00,0x00,0x00,0x00, - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x39,0x00,0x45,0x00,0x42,0x00,0x43,0x00,0x3C,0x80,0x00,0x00,0x00,0x00, + 10, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x39,0x00,0x45,0x00,0x42,0x00,0x43,0x00,0x3C,0x80,0x00,0x00,0x00,0x00, - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, + 5, // 0x28 '(' + 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - 5, // 0x29 ')' - 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, + 5, // 0x29 ')' + 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - 8, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x2A '*' + 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, + 5, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - 5, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x80, + 5, // 0x2F '/' + 0x00,0x00,0x08,0x08,0x10,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x80, - 8, // 0x30 '0' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, + 8, // 0x30 '0' + 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 8, // 0x31 '1' - 0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, + 8, // 0x31 '1' + 0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, - 8, // 0x32 '2' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00, + 8, // 0x32 '2' + 0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00, - 8, // 0x33 '3' - 0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00, + 8, // 0x33 '3' + 0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00, - 8, // 0x34 '4' - 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00, + 8, // 0x34 '4' + 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00, - 8, // 0x35 '5' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x7C,0x02,0x02,0x02,0x42,0x3C,0x00,0x00, + 8, // 0x35 '5' + 0x00,0x00,0x00,0x7E,0x40,0x40,0x7C,0x02,0x02,0x02,0x42,0x3C,0x00,0x00, - 8, // 0x36 '6' - 0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, + 8, // 0x36 '6' + 0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 8, // 0x37 '7' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x00,0x00, + 8, // 0x37 '7' + 0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x00,0x00, - 8, // 0x38 '8' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00, + 8, // 0x38 '8' + 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00, - 8, // 0x39 '9' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00, + 8, // 0x39 '9' + 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00, - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00, + 5, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, + 5, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, + 7, // 0x3F '?' + 0x00,0x00,0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - 12, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x27,0x40,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x27,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, + 12, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x27,0x40,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x27,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x42,0x7E,0x81,0x81,0x00,0x00, + 8, // 0x41 'A' + 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x42,0x7E,0x81,0x81,0x00,0x00, - 8, // 0x42 'B' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, + 8, // 0x42 'B' + 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00, + 8, // 0x45 'E' + 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00, - 7, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00, + 7, // 0x46 'F' + 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00, - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, + 9, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, + 5, // 0x4A 'J' + 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00, + 8, // 0x4B 'K' + 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00, - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00, + 7, // 0x4C 'L' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00, - 10, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4C,0x80,0x4C,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00, + 10, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4C,0x80,0x4C,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00, - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00, - 10, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - 8, // 0x50 'P' - 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00, + 8, // 0x50 'P' + 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00, - 10, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80, + 10, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80, - 8, // 0x52 'R' - 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x7C,0x48,0x44,0x42,0x41,0x00,0x00, + 8, // 0x52 'R' + 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x7C,0x48,0x44,0x42,0x41,0x00,0x00, - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00, + 8, // 0x53 'S' + 0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00, - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x54 'T' + 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - 8, // 0x56 'V' - 0x00,0x00,0x00,0x81,0x81,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, + 8, // 0x56 'V' + 0x00,0x00,0x00,0x81,0x81,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, - 13, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00, + 13, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00, - 8, // 0x58 'X' - 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x18,0x24,0x42,0x42,0x00,0x00, + 8, // 0x58 'X' + 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x18,0x24,0x42,0x42,0x00,0x00, - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x82,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, + 7, // 0x59 'Y' + 0x00,0x00,0x00,0x82,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x10,0x20,0x40,0x7E,0x00,0x00, + 8, // 0x5A 'Z' + 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x10,0x20,0x40,0x7E,0x00,0x00, - 5, // 0x5B '[' - 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, + 5, // 0x5B '[' + 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - 5, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08, + 5, // 0x5C '\' + 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08, - 5, // 0x5D ']' - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, + 5, // 0x5D ']' + 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, + 8, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, - 8, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x60 '`' + 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00, - 8, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00, + 8, // 0x62 'b' + 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00, - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, + 6, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - 8, // 0x64 'd' - 0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, + 8, // 0x64 'd' + 0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 4, // 0x66 'f' + 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x3C, + 8, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x3C, - 8, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, + 8, // 0x68 'h' + 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 4, // 0x6A 'j' - 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, + 4, // 0x6A 'j' + 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - 7, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, + 7, // 0x6B 'k' + 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, + 11, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, + 8, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, + 8, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40, + 8, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40, - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02, + 8, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02, - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00, + 5, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00, - 5, // 0x74 't' - 0x00,0x00,0x00,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x40,0x38,0x00,0x00, + 5, // 0x74 't' + 0x00,0x00,0x00,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x40,0x38,0x00,0x00, - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, + 8, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, + 7, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, + 11, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, + 7, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, + 7, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - 8, // 0x7B '{' - 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C, + 8, // 0x7B '{' + 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C, - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 5, // 0x7C '|' + 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 8, // 0x7D '}' - 0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30, + 8, // 0x7D '}' + 0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30, - 10, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, + 12, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana14_bold[] = - { - 14, 3, 32, 128-32, - 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x67,0x00,0x84,0x00,0xA1,0x00,0xB0,0x00, - 0xBF,0x00,0xCE,0x00,0xEB,0x00,0x08,0x01,0x17,0x01,0x26,0x01,0x35,0x01,0x44,0x01,0x61,0x01, - 0x7E,0x01,0x9B,0x01,0xB8,0x01,0xD5,0x01,0xF2,0x01,0x0F,0x02,0x2C,0x02,0x49,0x02,0x66,0x02, - 0x75,0x02,0x84,0x02,0xA1,0x02,0xBE,0x02,0xDB,0x02,0xEA,0x02,0x07,0x03,0x24,0x03,0x41,0x03, - 0x5E,0x03,0x7B,0x03,0x8A,0x03,0x99,0x03,0xB6,0x03,0xD3,0x03,0xE2,0x03,0xF1,0x03,0x0E,0x04, - 0x1D,0x04,0x3A,0x04,0x57,0x04,0x74,0x04,0x91,0x04,0xAE,0x04,0xCB,0x04,0xE8,0x04,0xF7,0x04, - 0x14,0x05,0x31,0x05,0x4E,0x05,0x6B,0x05,0x88,0x05,0x97,0x05,0xA6,0x05,0xB5,0x05,0xC4,0x05, - 0xE1,0x05,0xFE,0x05,0x1B,0x06,0x2A,0x06,0x39,0x06,0x48,0x06,0x57,0x06,0x66,0x06,0x75,0x06, - 0x84,0x06,0x93,0x06,0xA2,0x06,0xB1,0x06,0xC0,0x06,0xCF,0x06,0xEC,0x06,0xFB,0x06,0x0A,0x07, - 0x19,0x07,0x28,0x07,0x37,0x07,0x46,0x07,0x55,0x07,0x64,0x07,0x73,0x07,0x90,0x07,0x9F,0x07, - 0xAE,0x07,0xBD,0x07,0xDA,0x07,0xE9,0x07,0x06,0x08,0x23,0x08, +const int8u verdana14_bold[] = +{ + 14, 3, 32, 128-32, + 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x67,0x00,0x84,0x00,0xA1,0x00,0xB0,0x00, + 0xBF,0x00,0xCE,0x00,0xEB,0x00,0x08,0x01,0x17,0x01,0x26,0x01,0x35,0x01,0x44,0x01,0x61,0x01, + 0x7E,0x01,0x9B,0x01,0xB8,0x01,0xD5,0x01,0xF2,0x01,0x0F,0x02,0x2C,0x02,0x49,0x02,0x66,0x02, + 0x75,0x02,0x84,0x02,0xA1,0x02,0xBE,0x02,0xDB,0x02,0xEA,0x02,0x07,0x03,0x24,0x03,0x41,0x03, + 0x5E,0x03,0x7B,0x03,0x8A,0x03,0x99,0x03,0xB6,0x03,0xD3,0x03,0xE2,0x03,0xF1,0x03,0x0E,0x04, + 0x1D,0x04,0x3A,0x04,0x57,0x04,0x74,0x04,0x91,0x04,0xAE,0x04,0xCB,0x04,0xE8,0x04,0xF7,0x04, + 0x14,0x05,0x31,0x05,0x4E,0x05,0x6B,0x05,0x88,0x05,0x97,0x05,0xA6,0x05,0xB5,0x05,0xC4,0x05, + 0xE1,0x05,0xFE,0x05,0x1B,0x06,0x2A,0x06,0x39,0x06,0x48,0x06,0x57,0x06,0x66,0x06,0x75,0x06, + 0x84,0x06,0x93,0x06,0xA2,0x06,0xB1,0x06,0xC0,0x06,0xCF,0x06,0xEC,0x06,0xFB,0x06,0x0A,0x07, + 0x19,0x07,0x28,0x07,0x37,0x07,0x46,0x07,0x55,0x07,0x64,0x07,0x73,0x07,0x90,0x07,0x9F,0x07, + 0xAE,0x07,0xBD,0x07,0xDA,0x07,0xE9,0x07,0x06,0x08,0x23,0x08, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x60,0x00,0x00, + 5, // 0x21 '!' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x60,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, + 10, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x7E,0x00,0x3F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00, + 9, // 0x24 '$' + 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x7E,0x00,0x3F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00, - 15, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x6C,0x40,0x6C,0x80,0x6C,0xB8,0x6D,0x6C,0x3A,0x6C,0x02,0x6C,0x04,0x6C,0x04,0x38,0x00,0x00,0x00,0x00, + 15, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x6C,0x40,0x6C,0x80,0x6C,0xB8,0x6D,0x6C,0x3A,0x6C,0x02,0x6C,0x04,0x6C,0x04,0x38,0x00,0x00,0x00,0x00, - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, + 10, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, - 4, // 0x27 ''' - 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, + 7, // 0x28 '(' + 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, - 7, // 0x29 ')' - 0x00,0x00,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30, + 7, // 0x29 ')' + 0x00,0x00,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30, - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, + 4, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, + 4, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - 8, // 0x2F '/' - 0x00,0x00,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x30,0x30,0x60,0x60, + 8, // 0x2F '/' + 0x00,0x00,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x30,0x30,0x60,0x60, - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, + 9, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, + 9, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x1E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x1E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00, + 9, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00, - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x00, + 9, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x00, - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00, - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, + 5, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x60,0x40, + 5, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - 10, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00, + 10, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00, - 10, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x00,0x00,0x00,0x00, + 10, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x30,0x00,0x00, + 7, // 0x3F '?' + 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x30,0x00,0x00, - 12, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x2F,0x40,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x2F,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, + 12, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x2F,0x40,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x2F,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, + 9, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - 9, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x31,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x31,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x31,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x31,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - 10, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, + 10, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, + 8, // 0x45 'E' + 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, - 8, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, + 8, // 0x46 'F' + 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, - 10, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x30,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x67,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00, + 10, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x30,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x67,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00, - 10, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00, + 10, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00, - 6, // 0x49 'I' - 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, + 6, // 0x49 'I' + 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00, + 7, // 0x4A 'J' + 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00, - 9, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x70,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x70,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00, + 8, // 0x4C 'L' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00, - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x71,0xC0,0x71,0xC0,0x5A,0xC0,0x5A,0xC0,0x4C,0xC0,0x4C,0xC0,0x40,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00, + 11, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x71,0xC0,0x71,0xC0,0x5A,0xC0,0x5A,0xC0,0x4C,0xC0,0x4C,0xC0,0x40,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00, - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x41,0x80,0x00,0x00,0x00,0x00, + 10, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x41,0x80,0x00,0x00,0x00,0x00, - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00, - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, + 9, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x06,0x00,0x03,0xC0, + 11, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x06,0x00,0x03,0xC0, - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00, + 9, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00, - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, + 9, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - 8, // 0x54 'T' - 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, + 8, // 0x54 'T' + 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00, + 10, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00, - 9, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, + 9, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - 14, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00, + 14, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00, - 9, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, + 9, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, + 10, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x7E,0x00,0x00, + 8, // 0x5A 'Z' + 0x00,0x00,0x00,0x7E,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x7E,0x00,0x00, - 6, // 0x5B '[' - 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, + 6, // 0x5B '[' + 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, - 8, // 0x5C '\' - 0x00,0x00,0x60,0x60,0x30,0x30,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x06,0x06, + 8, // 0x5C '\' + 0x00,0x00,0x60,0x60,0x30,0x30,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x06,0x06, - 6, // 0x5D ']' - 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, + 6, // 0x5D ']' + 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80, + 9, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80, - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x60 '`' + 0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00,0x00, - 8, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, + 8, // 0x62 'b' + 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, - 8, // 0x64 'd' - 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, + 8, // 0x64 'd' + 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 5, // 0x66 'f' + 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, + 8, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, - 8, // 0x68 'h' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, + 8, // 0x68 'h' + 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - 4, // 0x69 'i' - 0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 4, // 0x69 'i' + 0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, + 5, // 0x6A 'j' + 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - 8, // 0x6B 'k' - 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00, + 8, // 0x6B 'k' + 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00, - 4, // 0x6C 'l' - 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 4, // 0x6C 'l' + 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 12, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0xC0,0x77,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, + 12, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0xC0,0x77,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, + 8, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, + 8, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, + 8, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, + 8, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x38,0x0C,0x0C,0x78,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x38,0x0C,0x0C,0x78,0x00,0x00, - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00, + 5, // 0x74 't' + 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00, - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, + 8, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x00,0x00, + 8, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x00,0x00, - 12, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00, + 12, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00, - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00, + 8, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00, - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x30, + 8, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x30, - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x38,0x30,0x60,0x7C,0x00,0x00, + 7, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x38,0x30,0x60,0x7C,0x00,0x00, - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0E,0x00, + 9, // 0x7B '{' + 0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0E,0x00, - 6, // 0x7C '|' - 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 6, // 0x7C '|' + 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x38,0x00, + 9, // 0x7D '}' + 0x00,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x38,0x00, - 10, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x48,0x80,0x44,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x48,0x80,0x44,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, + 12, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana16[] = - { - 16, 4, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x65,0x00,0x86,0x00,0xA7,0x00,0xB8,0x00, - 0xC9,0x00,0xDA,0x00,0xFB,0x00,0x1C,0x01,0x2D,0x01,0x3E,0x01,0x4F,0x01,0x60,0x01,0x71,0x01, - 0x82,0x01,0x93,0x01,0xA4,0x01,0xB5,0x01,0xC6,0x01,0xD7,0x01,0xE8,0x01,0xF9,0x01,0x0A,0x02, - 0x1B,0x02,0x2C,0x02,0x4D,0x02,0x6E,0x02,0x8F,0x02,0xA0,0x02,0xC1,0x02,0xE2,0x02,0xF3,0x02, - 0x14,0x03,0x35,0x03,0x46,0x03,0x57,0x03,0x78,0x03,0x99,0x03,0xAA,0x03,0xBB,0x03,0xCC,0x03, - 0xDD,0x03,0xFE,0x03,0x1F,0x04,0x40,0x04,0x51,0x04,0x72,0x04,0x93,0x04,0xB4,0x04,0xD5,0x04, - 0xF6,0x04,0x17,0x05,0x38,0x05,0x59,0x05,0x7A,0x05,0x9B,0x05,0xAC,0x05,0xBD,0x05,0xCE,0x05, - 0xEF,0x05,0x00,0x06,0x11,0x06,0x22,0x06,0x33,0x06,0x44,0x06,0x55,0x06,0x66,0x06,0x77,0x06, - 0x88,0x06,0x99,0x06,0xAA,0x06,0xBB,0x06,0xCC,0x06,0xDD,0x06,0xFE,0x06,0x0F,0x07,0x20,0x07, - 0x31,0x07,0x42,0x07,0x53,0x07,0x64,0x07,0x75,0x07,0x86,0x07,0x97,0x07,0xB8,0x07,0xC9,0x07, - 0xDA,0x07,0xEB,0x07,0xFC,0x07,0x0D,0x08,0x1E,0x08,0x3F,0x08, +const int8u verdana16[] = +{ + 16, 4, 32, 128-32, + 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x65,0x00,0x86,0x00,0xA7,0x00,0xB8,0x00, + 0xC9,0x00,0xDA,0x00,0xFB,0x00,0x1C,0x01,0x2D,0x01,0x3E,0x01,0x4F,0x01,0x60,0x01,0x71,0x01, + 0x82,0x01,0x93,0x01,0xA4,0x01,0xB5,0x01,0xC6,0x01,0xD7,0x01,0xE8,0x01,0xF9,0x01,0x0A,0x02, + 0x1B,0x02,0x2C,0x02,0x4D,0x02,0x6E,0x02,0x8F,0x02,0xA0,0x02,0xC1,0x02,0xE2,0x02,0xF3,0x02, + 0x14,0x03,0x35,0x03,0x46,0x03,0x57,0x03,0x78,0x03,0x99,0x03,0xAA,0x03,0xBB,0x03,0xCC,0x03, + 0xDD,0x03,0xFE,0x03,0x1F,0x04,0x40,0x04,0x51,0x04,0x72,0x04,0x93,0x04,0xB4,0x04,0xD5,0x04, + 0xF6,0x04,0x17,0x05,0x38,0x05,0x59,0x05,0x7A,0x05,0x9B,0x05,0xAC,0x05,0xBD,0x05,0xCE,0x05, + 0xEF,0x05,0x00,0x06,0x11,0x06,0x22,0x06,0x33,0x06,0x44,0x06,0x55,0x06,0x66,0x06,0x77,0x06, + 0x88,0x06,0x99,0x06,0xAA,0x06,0xBB,0x06,0xCC,0x06,0xDD,0x06,0xFE,0x06,0x0F,0x07,0x20,0x07, + 0x31,0x07,0x42,0x07,0x53,0x07,0x64,0x07,0x75,0x07,0x86,0x07,0x97,0x07,0xB8,0x07,0xC9,0x07, + 0xDA,0x07,0xEB,0x07,0xFC,0x07,0x0D,0x08,0x1E,0x08,0x3F,0x08, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, + 5, // 0x21 '!' + 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - 5, // 0x22 '"' - 0x00,0x00,0x00,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x22 '"' + 0x00,0x00,0x00,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x24 '$' - 0x00,0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10,0x00, + 8, // 0x24 '$' + 0x00,0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10,0x00, - 13, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x80,0x45,0x00,0x45,0x00,0x3A,0xE0,0x05,0x10,0x05,0x10,0x09,0x10,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x80,0x45,0x00,0x45,0x00,0x3A,0xE0,0x05,0x10,0x05,0x10,0x09,0x10,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x80,0x45,0x00,0x42,0x00,0x46,0x00,0x39,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x80,0x45,0x00,0x42,0x00,0x46,0x00,0x39,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 3, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 3, // 0x27 ''' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, + 6, // 0x28 '(' + 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - 6, // 0x29 ')' - 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, + 6, // 0x29 ')' + 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - 6, // 0x2F '/' - 0x00,0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, + 6, // 0x2F '/' + 0x00,0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - 8, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,0x00, + 8, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,0x00, - 8, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00,0x00, + 8, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00,0x00, - 8, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00,0x00, + 8, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00,0x00, - 8, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x3E,0x20,0x20,0x20,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x3E,0x20,0x20,0x20,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00,0x00, + 8, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00,0x00, - 8, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00,0x00, + 8, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00,0x00, - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, + 6, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, + 6, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, + 7, // 0x3F '?' + 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - 13, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x10,0x40,0x27,0xA0,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x27,0xE0,0x10,0x00,0x0F,0x80,0x00,0x00, + 13, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x10,0x40,0x27,0xA0,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x27,0xE0,0x10,0x00,0x0F,0x80,0x00,0x00, - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x14,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x14,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, + 8, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, + 8, // 0x45 'E' + 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, - 8, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 8, // 0x46 'F' + 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00,0x00, + 8, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00,0x00, - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, + 7, // 0x4C 'L' + 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00,0x00, + 8, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00,0x00, - 10, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80,0x00,0x00, + 10, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80,0x00,0x00, - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x40,0x00,0x40,0x00,0x3E,0x00,0x01,0x00,0x01,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x40,0x00,0x40,0x00,0x3E,0x00,0x01,0x00,0x01,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x54 'T' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x5A 'Z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5B '[' - 0x00,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, + 6, // 0x5B '[' + 0x00,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - 6, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, + 6, // 0x5C '\' + 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - 6, // 0x5D ']' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, + 6, // 0x5D ']' + 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, - 11, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00, + 8, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00, - 8, // 0x60 '`' - 0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x60 '`' + 0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00,0x00, - 8, // 0x62 'b' - 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, + 8, // 0x62 'b' + 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x64 'd' - 0x00,0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, + 8, // 0x64 'd' + 0x00,0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x3C, + 8, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x3C, - 8, // 0x68 'h' - 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, + 8, // 0x68 'h' + 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 4, // 0x6A 'j' - 0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, + 4, // 0x6A 'j' + 0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - 7, // 0x6B 'k' - 0x00,0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, + 7, // 0x6B 'k' + 0x00,0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x80,0x66,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x80,0x66,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, + 8, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40, + 8, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40, - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x02, + 8, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x02, - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 5, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00,0x00, + 7, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00,0x00, - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, + 6, // 0x74 't' + 0x00,0x00,0x00,0x00,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, + 8, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00,0x00, + 8, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00,0x00, - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, + 7, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x10,0x10,0x20, + 8, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x10,0x10,0x20, - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, + 7, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - 8, // 0x7B '{' - 0x00,0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C,0x00, + 8, // 0x7B '{' + 0x00,0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C,0x00, - 7, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, + 7, // 0x7C '|' + 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - 8, // 0x7D '}' - 0x00,0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00, + 8, // 0x7D '}' + 0x00,0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00, - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana16_bold[] = - { - 16, 4, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x75,0x00,0xA6,0x00,0xC7,0x00,0xD8,0x00, - 0xE9,0x00,0xFA,0x00,0x1B,0x01,0x3C,0x01,0x4D,0x01,0x5E,0x01,0x6F,0x01,0x90,0x01,0xB1,0x01, - 0xD2,0x01,0xF3,0x01,0x14,0x02,0x35,0x02,0x56,0x02,0x77,0x02,0x98,0x02,0xB9,0x02,0xDA,0x02, - 0xEB,0x02,0xFC,0x02,0x1D,0x03,0x3E,0x03,0x5F,0x03,0x70,0x03,0x91,0x03,0xB2,0x03,0xD3,0x03, - 0xF4,0x03,0x15,0x04,0x36,0x04,0x57,0x04,0x78,0x04,0x99,0x04,0xAA,0x04,0xBB,0x04,0xDC,0x04, - 0xED,0x04,0x0E,0x05,0x2F,0x05,0x50,0x05,0x71,0x05,0x92,0x05,0xB3,0x05,0xD4,0x05,0xE5,0x05, - 0x06,0x06,0x27,0x06,0x48,0x06,0x69,0x06,0x8A,0x06,0xAB,0x06,0xBC,0x06,0xDD,0x06,0xEE,0x06, - 0x0F,0x07,0x30,0x07,0x51,0x07,0x72,0x07,0x93,0x07,0xA4,0x07,0xC5,0x07,0xE6,0x07,0xF7,0x07, - 0x18,0x08,0x39,0x08,0x4A,0x08,0x5B,0x08,0x6C,0x08,0x7D,0x08,0x9E,0x08,0xBF,0x08,0xE0,0x08, - 0x01,0x09,0x22,0x09,0x33,0x09,0x44,0x09,0x55,0x09,0x76,0x09,0x97,0x09,0xB8,0x09,0xD9,0x09, - 0xFA,0x09,0x0B,0x0A,0x2C,0x0A,0x3D,0x0A,0x5E,0x0A,0x7F,0x0A, +const int8u verdana16_bold[] = +{ + 16, 4, 32, 128-32, + 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x75,0x00,0xA6,0x00,0xC7,0x00,0xD8,0x00, + 0xE9,0x00,0xFA,0x00,0x1B,0x01,0x3C,0x01,0x4D,0x01,0x5E,0x01,0x6F,0x01,0x90,0x01,0xB1,0x01, + 0xD2,0x01,0xF3,0x01,0x14,0x02,0x35,0x02,0x56,0x02,0x77,0x02,0x98,0x02,0xB9,0x02,0xDA,0x02, + 0xEB,0x02,0xFC,0x02,0x1D,0x03,0x3E,0x03,0x5F,0x03,0x70,0x03,0x91,0x03,0xB2,0x03,0xD3,0x03, + 0xF4,0x03,0x15,0x04,0x36,0x04,0x57,0x04,0x78,0x04,0x99,0x04,0xAA,0x04,0xBB,0x04,0xDC,0x04, + 0xED,0x04,0x0E,0x05,0x2F,0x05,0x50,0x05,0x71,0x05,0x92,0x05,0xB3,0x05,0xD4,0x05,0xE5,0x05, + 0x06,0x06,0x27,0x06,0x48,0x06,0x69,0x06,0x8A,0x06,0xAB,0x06,0xBC,0x06,0xDD,0x06,0xEE,0x06, + 0x0F,0x07,0x30,0x07,0x51,0x07,0x72,0x07,0x93,0x07,0xA4,0x07,0xC5,0x07,0xE6,0x07,0xF7,0x07, + 0x18,0x08,0x39,0x08,0x4A,0x08,0x5B,0x08,0x6C,0x08,0x7D,0x08,0x9E,0x08,0xBF,0x08,0xE0,0x08, + 0x01,0x09,0x22,0x09,0x33,0x09,0x44,0x09,0x55,0x09,0x76,0x09,0x97,0x09,0xB8,0x09,0xD9,0x09, + 0xFA,0x09,0x0B,0x0A,0x2C,0x0A,0x3D,0x0A,0x5E,0x0A,0x7F,0x0A, - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x00,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x00,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, + 9, // 0x24 '$' + 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - 17, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x00,0x66,0x20,0x00,0x66,0x40,0x00,0x66,0x5E,0x00,0x66,0xB3,0x00,0x3D,0x33,0x00,0x01,0x33,0x00,0x02,0x33,0x00,0x02,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 17, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x00,0x66,0x20,0x00,0x66,0x40,0x00,0x66,0x5E,0x00,0x66,0xB3,0x00,0x3D,0x33,0x00,0x01,0x33,0x00,0x02,0x33,0x00,0x02,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0xC0,0x3C,0xC0,0x66,0x80,0x63,0x00,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0xC0,0x3C,0xC0,0x66,0x80,0x63,0x00,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, + 7, // 0x28 '(' + 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, - 7, // 0x29 ')' - 0x00,0x00,0x00,0x60,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x60, + 7, // 0x29 ')' + 0x00,0x00,0x00,0x60,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x60, - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 9, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, + 9, // 0x2F '/' + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x0E,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x0E,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, + 5, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x38,0x30,0x30,0x60,0x60, + 5, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x38,0x30,0x30,0x60,0x60, - 11, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00, + 8, // 0x3F '?' + 0x00,0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00, - 13, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x27,0xA0,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x27,0xE0,0x30,0x00,0x0F,0x80,0x00,0x00,0x00,0x00, + 13, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x27,0xA0,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x27,0xE0,0x30,0x00,0x0F,0x80,0x00,0x00,0x00,0x00, - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x7F,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x7F,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x45 'E' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x46 'F' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x63,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x63,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, + 6, // 0x49 'I' + 0x00,0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00,0x00, + 7, // 0x4A 'J' + 0x00,0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00,0x00, - 9, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00,0x00, + 8, // 0x4C 'L' + 0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00,0x00, - 12, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x70,0xE0,0x59,0x60,0x59,0x60,0x4E,0x60,0x4E,0x60,0x44,0x60,0x44,0x60,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x70,0xE0,0x59,0x60,0x59,0x60,0x4E,0x60,0x4E,0x60,0x44,0x60,0x44,0x60,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x03,0x00,0x01,0xC0,0x00,0x00, + 11, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x03,0x00,0x01,0xC0,0x00,0x00, - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x54 'T' - 0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00, + 8, // 0x54 'T' + 0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00, - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x5A 'Z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5B '[' - 0x00,0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00, + 6, // 0x5B '[' + 0x00,0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00, - 9, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x00,0x00, + 9, // 0x5C '\' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x00,0x00, - 6, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00, + 6, // 0x5D ']' + 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00, - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, + 9, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x60 '`' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x62 'b' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00, - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x64 'd' + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x66 'f' - 0x00,0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 5, // 0x66 'f' + 0x00,0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x3E,0x00, + 9, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x3E,0x00, - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x68 'h' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 4, // 0x69 'i' + 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, + 5, // 0x6A 'j' + 0x00,0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - 8, // 0x6B 'k' - 0x00,0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00,0x00, + 8, // 0x6B 'k' + 0x00,0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00,0x00, - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 4, // 0x6C 'l' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 14, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, + 9, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x03,0x00, + 9, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x03,0x00, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x70,0x3C,0x0E,0x06,0x7C,0x00,0x00,0x00, + 8, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x70,0x3C,0x0E,0x06,0x7C,0x00,0x00,0x00, - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00,0x00, + 6, // 0x74 't' + 0x00,0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00,0x00, - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, + 9, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, + 8, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x00,0x00, + 9, // 0x7B '{' + 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x00,0x00, - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, + 8, // 0x7C '|' + 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x00,0x00, + 9, // 0x7D '}' + 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x00,0x00, - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana17[] = - { - 17, 4, 32, 128-32, - 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0x9F,0x00,0xC2,0x00,0xD4,0x00, - 0xE6,0x00,0xF8,0x00,0x1B,0x01,0x3E,0x01,0x50,0x01,0x62,0x01,0x74,0x01,0x86,0x01,0xA9,0x01, - 0xCC,0x01,0xEF,0x01,0x12,0x02,0x35,0x02,0x58,0x02,0x7B,0x02,0x9E,0x02,0xC1,0x02,0xE4,0x02, - 0xF6,0x02,0x08,0x03,0x2B,0x03,0x4E,0x03,0x71,0x03,0x83,0x03,0xA6,0x03,0xC9,0x03,0xEC,0x03, - 0x0F,0x04,0x32,0x04,0x55,0x04,0x67,0x04,0x8A,0x04,0xAD,0x04,0xBF,0x04,0xD1,0x04,0xF4,0x04, - 0x06,0x05,0x29,0x05,0x4C,0x05,0x6F,0x05,0x81,0x05,0xA4,0x05,0xC7,0x05,0xEA,0x05,0x0D,0x06, - 0x30,0x06,0x53,0x06,0x76,0x06,0x99,0x06,0xBC,0x06,0xDF,0x06,0xF1,0x06,0x03,0x07,0x15,0x07, - 0x38,0x07,0x5B,0x07,0x7E,0x07,0x90,0x07,0xB3,0x07,0xC5,0x07,0xE8,0x07,0xFA,0x07,0x0C,0x08, - 0x2F,0x08,0x52,0x08,0x64,0x08,0x76,0x08,0x88,0x08,0x9A,0x08,0xBD,0x08,0xE0,0x08,0x03,0x09, - 0x26,0x09,0x49,0x09,0x5B,0x09,0x6D,0x09,0x7F,0x09,0xA2,0x09,0xB4,0x09,0xD7,0x09,0xFA,0x09, - 0x0C,0x0A,0x1E,0x0A,0x41,0x0A,0x53,0x0A,0x76,0x0A,0x99,0x0A, +const int8u verdana17[] = +{ + 17, 4, 32, 128-32, + 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0x9F,0x00,0xC2,0x00,0xD4,0x00, + 0xE6,0x00,0xF8,0x00,0x1B,0x01,0x3E,0x01,0x50,0x01,0x62,0x01,0x74,0x01,0x86,0x01,0xA9,0x01, + 0xCC,0x01,0xEF,0x01,0x12,0x02,0x35,0x02,0x58,0x02,0x7B,0x02,0x9E,0x02,0xC1,0x02,0xE4,0x02, + 0xF6,0x02,0x08,0x03,0x2B,0x03,0x4E,0x03,0x71,0x03,0x83,0x03,0xA6,0x03,0xC9,0x03,0xEC,0x03, + 0x0F,0x04,0x32,0x04,0x55,0x04,0x67,0x04,0x8A,0x04,0xAD,0x04,0xBF,0x04,0xD1,0x04,0xF4,0x04, + 0x06,0x05,0x29,0x05,0x4C,0x05,0x6F,0x05,0x81,0x05,0xA4,0x05,0xC7,0x05,0xEA,0x05,0x0D,0x06, + 0x30,0x06,0x53,0x06,0x76,0x06,0x99,0x06,0xBC,0x06,0xDF,0x06,0xF1,0x06,0x03,0x07,0x15,0x07, + 0x38,0x07,0x5B,0x07,0x7E,0x07,0x90,0x07,0xB3,0x07,0xC5,0x07,0xE8,0x07,0xFA,0x07,0x0C,0x08, + 0x2F,0x08,0x52,0x08,0x64,0x08,0x76,0x08,0x88,0x08,0x9A,0x08,0xBD,0x08,0xE0,0x08,0x03,0x09, + 0x26,0x09,0x49,0x09,0x5B,0x09,0x6D,0x09,0x7F,0x09,0xA2,0x09,0xB4,0x09,0xD7,0x09,0xFA,0x09, + 0x0C,0x0A,0x1E,0x0A,0x41,0x0A,0x53,0x0A,0x76,0x0A,0x99,0x0A, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - 6, // 0x22 '"' - 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 6, // 0x22 '"' + 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x3E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, + 9, // 0x24 '$' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x3E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - 15, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x80,0x44,0x80,0x45,0x38,0x39,0x44,0x02,0x44,0x04,0x44,0x04,0x44,0x08,0x38,0x00,0x00,0x00,0x00,0x00,0x00, + 15, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x80,0x44,0x80,0x45,0x38,0x39,0x44,0x02,0x44,0x04,0x44,0x04,0x44,0x08,0x38,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x38,0x80,0x44,0x80,0x42,0x80,0x41,0x00,0x22,0x80,0x1C,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x38,0x80,0x44,0x80,0x42,0x80,0x41,0x00,0x22,0x80,0x1C,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, + 6, // 0x28 '(' + 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - 6, // 0x29 ')' - 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, + 6, // 0x29 ')' + 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - 6, // 0x2F '/' - 0x00,0x00,0x00,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x00, + 6, // 0x2F '/' + 0x00,0x00,0x00,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x02,0x00,0x1C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x02,0x00,0x1C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x22,0x00,0x42,0x00,0x7F,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x22,0x00,0x42,0x00,0x7F,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, + 6, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, + 6, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - 11, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x0C,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, + 8, // 0x3F '?' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x0C,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, + 14, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0x80,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x30,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0x80,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x30,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x45 'E' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 8, // 0x46 'F' + 0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 11, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x43,0xC0,0x40,0x40,0x20,0x40,0x30,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x43,0xC0,0x40,0x40,0x20,0x40,0x30,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, + 6, // 0x4A 'J' + 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, - 10, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, + 8, // 0x4C 'L' + 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x60,0x80,0x50,0x80,0x48,0x80,0x48,0x80,0x44,0x80,0x44,0x80,0x42,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x60,0x80,0x50,0x80,0x48,0x80,0x48,0x80,0x44,0x80,0x44,0x80,0x42,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x7C,0x42,0x41,0x41,0x42,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 8, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x7C,0x42,0x41,0x41,0x42,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x02,0x00,0x02,0x00,0x01,0xC0, + 11, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x02,0x00,0x02,0x00,0x01,0xC0, - 10, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x38,0x00,0x07,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x38,0x00,0x07,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x54 'T' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 15, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 15, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5A 'Z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x5B '[' - 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, + 6, // 0x5B '[' + 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, - 6, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x00, + 6, // 0x5C '\' + 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x00, - 6, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, + 6, // 0x5D ']' + 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, - 11, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, + 9, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x60 '`' + 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x02,0x3E,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, + 8, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x02,0x3E,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x62 'b' + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, + 7, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x64 'd' + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x7E,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, + 8, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x7E,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x00,0x00,0x1C,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, + 9, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x68 'h' + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, + 5, // 0x6A 'j' + 0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, - 8, // 0x6B 'k' - 0x00,0x00,0x00,0x40,0x40,0x40,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00,0x00, + 8, // 0x6B 'k' + 0x00,0x00,0x00,0x40,0x40,0x40,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 13, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0xE0,0x63,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0xE0,0x63,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, + 9, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, + 9, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, + 6, // 0x74 't' + 0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x00,0x00,0x00, + 8, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x00,0x00,0x00, - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x10,0x10,0x20, + 8, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x10,0x10,0x20, - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00,0x00, + 8, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00,0x00, - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, + 9, // 0x7B '{' + 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, - 6, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 6, // 0x7C '|' + 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x70,0x00, + 9, // 0x7D '}' + 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x70,0x00, - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana17_bold[] = - { - 17, 4, 32, 128-32, - 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0xB0,0x00,0xD3,0x00,0xE5,0x00, - 0xF7,0x00,0x09,0x01,0x2C,0x01,0x4F,0x01,0x61,0x01,0x73,0x01,0x85,0x01,0xA8,0x01,0xCB,0x01, - 0xEE,0x01,0x11,0x02,0x34,0x02,0x57,0x02,0x7A,0x02,0x9D,0x02,0xC0,0x02,0xE3,0x02,0x06,0x03, - 0x18,0x03,0x2A,0x03,0x4D,0x03,0x70,0x03,0x93,0x03,0xB6,0x03,0xD9,0x03,0xFC,0x03,0x1F,0x04, - 0x42,0x04,0x65,0x04,0x88,0x04,0xAB,0x04,0xCE,0x04,0xF1,0x04,0x03,0x05,0x15,0x05,0x38,0x05, - 0x5B,0x05,0x7E,0x05,0xA1,0x05,0xC4,0x05,0xE7,0x05,0x0A,0x06,0x2D,0x06,0x50,0x06,0x73,0x06, - 0x96,0x06,0xB9,0x06,0xDC,0x06,0xFF,0x06,0x22,0x07,0x45,0x07,0x57,0x07,0x7A,0x07,0x8C,0x07, - 0xAF,0x07,0xD2,0x07,0xF5,0x07,0x18,0x08,0x3B,0x08,0x4D,0x08,0x70,0x08,0x93,0x08,0xA5,0x08, - 0xC8,0x08,0xEB,0x08,0xFD,0x08,0x0F,0x09,0x32,0x09,0x44,0x09,0x67,0x09,0x8A,0x09,0xAD,0x09, - 0xD0,0x09,0xF3,0x09,0x05,0x0A,0x17,0x0A,0x29,0x0A,0x4C,0x0A,0x6F,0x0A,0x92,0x0A,0xB5,0x0A, - 0xD8,0x0A,0xEA,0x0A,0x0D,0x0B,0x1F,0x0B,0x42,0x0B,0x65,0x0B, +const int8u verdana17_bold[] = +{ + 17, 4, 32, 128-32, + 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0xB0,0x00,0xD3,0x00,0xE5,0x00, + 0xF7,0x00,0x09,0x01,0x2C,0x01,0x4F,0x01,0x61,0x01,0x73,0x01,0x85,0x01,0xA8,0x01,0xCB,0x01, + 0xEE,0x01,0x11,0x02,0x34,0x02,0x57,0x02,0x7A,0x02,0x9D,0x02,0xC0,0x02,0xE3,0x02,0x06,0x03, + 0x18,0x03,0x2A,0x03,0x4D,0x03,0x70,0x03,0x93,0x03,0xB6,0x03,0xD9,0x03,0xFC,0x03,0x1F,0x04, + 0x42,0x04,0x65,0x04,0x88,0x04,0xAB,0x04,0xCE,0x04,0xF1,0x04,0x03,0x05,0x15,0x05,0x38,0x05, + 0x5B,0x05,0x7E,0x05,0xA1,0x05,0xC4,0x05,0xE7,0x05,0x0A,0x06,0x2D,0x06,0x50,0x06,0x73,0x06, + 0x96,0x06,0xB9,0x06,0xDC,0x06,0xFF,0x06,0x22,0x07,0x45,0x07,0x57,0x07,0x7A,0x07,0x8C,0x07, + 0xAF,0x07,0xD2,0x07,0xF5,0x07,0x18,0x08,0x3B,0x08,0x4D,0x08,0x70,0x08,0x93,0x08,0xA5,0x08, + 0xC8,0x08,0xEB,0x08,0xFD,0x08,0x0F,0x09,0x32,0x09,0x44,0x09,0x67,0x09,0x8A,0x09,0xAD,0x09, + 0xD0,0x09,0xF3,0x09,0x05,0x0A,0x17,0x0A,0x29,0x0A,0x4C,0x0A,0x6F,0x0A,0x92,0x0A,0xB5,0x0A, + 0xD8,0x0A,0xEA,0x0A,0x0D,0x0B,0x1F,0x0B,0x42,0x0B,0x65,0x0B, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - 8, // 0x22 '"' - 0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 8, // 0x22 '"' + 0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x04,0x40,0x3F,0xE0,0x3F,0xE0,0x08,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x04,0x40,0x3F,0xE0,0x3F,0xE0,0x08,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x34,0x80,0x64,0x00,0x74,0x00,0x3C,0x00,0x0F,0x00,0x0B,0x80,0x09,0x80,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, + 10, // 0x24 '$' + 0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x34,0x80,0x64,0x00,0x74,0x00,0x3C,0x00,0x0F,0x00,0x0B,0x80,0x09,0x80,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - 18, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x08,0x00,0x66,0x10,0x00,0x66,0x20,0x00,0x66,0x2F,0x00,0x66,0x59,0x80,0x66,0x99,0x80,0x3D,0x19,0x80,0x01,0x19,0x80,0x02,0x19,0x80,0x04,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 18, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x08,0x00,0x66,0x10,0x00,0x66,0x20,0x00,0x66,0x2F,0x00,0x66,0x59,0x80,0x66,0x99,0x80,0x3D,0x19,0x80,0x01,0x19,0x80,0x02,0x19,0x80,0x04,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x36,0x00,0x1C,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x31,0xC0,0x1F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x36,0x00,0x1C,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x31,0xC0,0x1F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x28 '(' - 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, + 8, // 0x28 '(' + 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, - 8, // 0x29 ')' - 0x00,0x00,0x00,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30, + 8, // 0x29 ')' + 0x00,0x00,0x00,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30, - 10, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0,0x00, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0,0x00, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - 10, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, + 10, // 0x2F '/' + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - 10, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x0F,0x00,0x03,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x0F,0x00,0x03,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x00,0x0B,0x00,0x13,0x00,0x23,0x00,0x43,0x00,0x7F,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x00,0x0B,0x00,0x13,0x00,0x23,0x00,0x43,0x00,0x7F,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x38,0x00,0x30,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x38,0x00,0x30,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x03,0x00,0x07,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x03,0x00,0x07,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, + 6, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x60,0x60,0x00, + 6, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x60,0x60,0x00, - 12, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3F '?' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, + 14, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - 11, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x1B,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x1B,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x61,0x80,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x61,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x61,0x80,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x61,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x45 'E' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x46 'F' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x63,0xC0,0x60,0xC0,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x63,0xC0,0x60,0xC0,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, + 8, // 0x49 'I' + 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, - 8, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, + 8, // 0x4A 'J' + 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, - 11, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7C,0x00,0x76,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7C,0x00,0x76,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x4C 'L' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x70,0x70,0x70,0xF0,0x58,0xB0,0x59,0xB0,0x4D,0x30,0x4F,0x30,0x46,0x30,0x46,0x30,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x70,0x70,0x70,0xF0,0x58,0xB0,0x59,0xB0,0x4D,0x30,0x4F,0x30,0x46,0x30,0x46,0x30,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x70,0x40,0x58,0x40,0x4C,0x40,0x4C,0x40,0x46,0x40,0x43,0x40,0x43,0x40,0x41,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x70,0x40,0x58,0x40,0x4C,0x40,0x4C,0x40,0x46,0x40,0x43,0x40,0x43,0x40,0x41,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x03,0x00,0x03,0x00,0x01,0xE0, + 12, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x03,0x00,0x03,0x00,0x01,0xE0, - 11, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x3E,0x00,0x1F,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x3E,0x00,0x1F,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x54 'T' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 16, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x32,0x4C,0x36,0x6C,0x36,0x6C,0x34,0x2C,0x1C,0x38,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 16, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x32,0x4C,0x36,0x6C,0x36,0x6C,0x34,0x2C,0x1C,0x38,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5A 'Z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5B '[' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, + 8, // 0x5B '[' + 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, - 10, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, + 10, // 0x5C '\' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, - 8, // 0x5D ']' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, + 8, // 0x5D ']' + 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, - 12, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, + 10, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, - 10, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x60 '`' + 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x62 'b' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, - 10, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x64 'd' + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x00,0x00,0x1C,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - 10, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, + 10, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, - 10, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x68 'h' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 4, // 0x69 'i' + 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 6, // 0x6A 'j' - 0x00,0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, + 6, // 0x6A 'j' + 0x00,0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, - 9, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6B 'k' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 4, // 0x6C 'l' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 14, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, + 10, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - 10, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, + 10, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00,0x00, + 8, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00,0x00, - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x60,0x60,0xFC,0x60,0x60,0x60,0x60,0x60,0x60,0x3C,0x00,0x00,0x00, + 6, // 0x74 't' + 0x00,0x00,0x00,0x00,0x60,0x60,0xFC,0x60,0x60,0x60,0x60,0x60,0x60,0x3C,0x00,0x00,0x00, - 10, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x1C,0xE0,0x0C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x1C,0xE0,0x0C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, + 9, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, + 8, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, - 10, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, + 10, // 0x7B '{' + 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 8, // 0x7C '|' + 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 10, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x78,0x00, + 10, // 0x7D '}' + 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x78,0x00, - 12, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x46,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x46,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana18[] = - { - 18, 4, 32, 128-32, - 0x00,0x00,0x13,0x00,0x26,0x00,0x39,0x00,0x5E,0x00,0x83,0x00,0xA8,0x00,0xCD,0x00,0xE0,0x00, - 0xF3,0x00,0x06,0x01,0x2B,0x01,0x50,0x01,0x63,0x01,0x76,0x01,0x89,0x01,0x9C,0x01,0xC1,0x01, - 0xE6,0x01,0x0B,0x02,0x30,0x02,0x55,0x02,0x7A,0x02,0x9F,0x02,0xC4,0x02,0xE9,0x02,0x0E,0x03, - 0x21,0x03,0x34,0x03,0x59,0x03,0x7E,0x03,0xA3,0x03,0xB6,0x03,0xDB,0x03,0x00,0x04,0x25,0x04, - 0x4A,0x04,0x6F,0x04,0x94,0x04,0xB9,0x04,0xDE,0x04,0x03,0x05,0x16,0x05,0x29,0x05,0x4E,0x05, - 0x61,0x05,0x86,0x05,0xAB,0x05,0xD0,0x05,0xF5,0x05,0x1A,0x06,0x3F,0x06,0x64,0x06,0x89,0x06, - 0xAE,0x06,0xD3,0x06,0xF8,0x06,0x1D,0x07,0x42,0x07,0x67,0x07,0x7A,0x07,0x8D,0x07,0xA0,0x07, - 0xC5,0x07,0xEA,0x07,0x0F,0x08,0x34,0x08,0x59,0x08,0x6C,0x08,0x91,0x08,0xB6,0x08,0xC9,0x08, - 0xEE,0x08,0x13,0x09,0x26,0x09,0x39,0x09,0x5E,0x09,0x71,0x09,0x96,0x09,0xBB,0x09,0xE0,0x09, - 0x05,0x0A,0x2A,0x0A,0x3D,0x0A,0x50,0x0A,0x63,0x0A,0x88,0x0A,0xAD,0x0A,0xD2,0x0A,0xF7,0x0A, - 0x1C,0x0B,0x41,0x0B,0x66,0x0B,0x79,0x0B,0x9E,0x0B,0xC3,0x0B, +const int8u verdana18[] = +{ + 18, 4, 32, 128-32, + 0x00,0x00,0x13,0x00,0x26,0x00,0x39,0x00,0x5E,0x00,0x83,0x00,0xA8,0x00,0xCD,0x00,0xE0,0x00, + 0xF3,0x00,0x06,0x01,0x2B,0x01,0x50,0x01,0x63,0x01,0x76,0x01,0x89,0x01,0x9C,0x01,0xC1,0x01, + 0xE6,0x01,0x0B,0x02,0x30,0x02,0x55,0x02,0x7A,0x02,0x9F,0x02,0xC4,0x02,0xE9,0x02,0x0E,0x03, + 0x21,0x03,0x34,0x03,0x59,0x03,0x7E,0x03,0xA3,0x03,0xB6,0x03,0xDB,0x03,0x00,0x04,0x25,0x04, + 0x4A,0x04,0x6F,0x04,0x94,0x04,0xB9,0x04,0xDE,0x04,0x03,0x05,0x16,0x05,0x29,0x05,0x4E,0x05, + 0x61,0x05,0x86,0x05,0xAB,0x05,0xD0,0x05,0xF5,0x05,0x1A,0x06,0x3F,0x06,0x64,0x06,0x89,0x06, + 0xAE,0x06,0xD3,0x06,0xF8,0x06,0x1D,0x07,0x42,0x07,0x67,0x07,0x7A,0x07,0x8D,0x07,0xA0,0x07, + 0xC5,0x07,0xEA,0x07,0x0F,0x08,0x34,0x08,0x59,0x08,0x6C,0x08,0x91,0x08,0xB6,0x08,0xC9,0x08, + 0xEE,0x08,0x13,0x09,0x26,0x09,0x39,0x09,0x5E,0x09,0x71,0x09,0x96,0x09,0xBB,0x09,0xE0,0x09, + 0x05,0x0A,0x2A,0x0A,0x3D,0x0A,0x50,0x0A,0x63,0x0A,0x88,0x0A,0xAD,0x0A,0xD2,0x0A,0xF7,0x0A, + 0x1C,0x0B,0x41,0x0B,0x66,0x0B,0x79,0x0B,0x9E,0x0B,0xC3,0x0B, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - 7, // 0x22 '"' - 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x22 '"' + 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x11,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x11,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x38,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x08,0x00, + 10, // 0x24 '$' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x38,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x08,0x00, - 16, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x40,0x44,0x80,0x44,0x80,0x38,0x9C,0x01,0x22,0x01,0x22,0x02,0x22,0x02,0x22,0x04,0x1C,0x00,0x00,0x00,0x00,0x00,0x00, + 16, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x40,0x44,0x80,0x44,0x80,0x38,0x9C,0x01,0x22,0x01,0x22,0x02,0x22,0x02,0x22,0x04,0x1C,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x1E,0x40,0x24,0x40,0x42,0x40,0x41,0x40,0x40,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x1E,0x40,0x24,0x40,0x42,0x40,0x41,0x40,0x40,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 4, // 0x27 ''' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, + 7, // 0x28 '(' + 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - 7, // 0x29 ')' - 0x00,0x00,0x00,0x20,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x20, + 7, // 0x29 ')' + 0x00,0x00,0x00,0x20,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x20, - 10, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - 7, // 0x2F '/' - 0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, + 7, // 0x2F '/' + 0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, - 10, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1C,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1C,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x40,0x80,0x00,0x80,0x01,0x00,0x0E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x40,0x80,0x00,0x80,0x01,0x00,0x0E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x00,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x7F,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x00,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x7F,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, + 7, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, - 7, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x20,0x20, + 7, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x20,0x20, - 12, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, + 8, // 0x3F '?' + 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - 15, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x23,0xD0,0x44,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x44,0x48,0x23,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, + 15, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x23,0xD0,0x44,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x44,0x48,0x23,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x45 'E' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x46 'F' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x20,0x20,0x40,0x00,0x40,0x00,0x41,0xE0,0x40,0x20,0x40,0x20,0x20,0x20,0x30,0x20,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x20,0x20,0x40,0x00,0x40,0x00,0x41,0xE0,0x40,0x20,0x40,0x20,0x20,0x20,0x30,0x20,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, + 5, // 0x49 'I' + 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0xF0,0x00,0x00,0x00, + 7, // 0x4A 'J' + 0x00,0x00,0x00,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0xF0,0x00,0x00,0x00, - 10, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, + 8, // 0x4C 'L' + 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, - 13, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x50,0x50,0x50,0x50,0x48,0x90,0x48,0x90,0x45,0x10,0x45,0x10,0x42,0x10,0x42,0x10,0x40,0x10,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x50,0x50,0x50,0x50,0x48,0x90,0x48,0x90,0x45,0x10,0x45,0x10,0x42,0x10,0x42,0x10,0x40,0x10,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x60,0x40,0x50,0x40,0x48,0x40,0x48,0x40,0x44,0x40,0x42,0x40,0x42,0x40,0x41,0x40,0x40,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x60,0x40,0x50,0x40,0x48,0x40,0x48,0x40,0x44,0x40,0x42,0x40,0x42,0x40,0x41,0x40,0x40,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x01,0x00,0x01,0x00,0x00,0xE0, + 12, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x01,0x00,0x01,0x00,0x00,0xE0, - 10, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x20,0x00,0x1E,0x00,0x01,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x20,0x00,0x1E,0x00,0x01,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x54 'T' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 15, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x12,0x90,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 15, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x12,0x90,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5A 'Z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x5B '[' - 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, + 7, // 0x5B '[' + 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, - 7, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x00, + 7, // 0x5C '\' + 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x00, - 7, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, + 7, // 0x5D ']' + 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, - 12, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, + 10, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, - 10, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x60 '`' + 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x01,0x00,0x3F,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x01,0x00,0x3F,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x62 'b' + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x21,0x40,0x40,0x40,0x40,0x21,0x1E,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x21,0x40,0x40,0x40,0x40,0x21,0x1E,0x00,0x00,0x00, - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x64 'd' + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x00,0x00,0x1C,0x20,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, + 9, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x68 'h' + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 3, // 0x69 'i' - 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x69 'i' + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, + 5, // 0x6A 'j' + 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, - 9, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6B 'k' + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 3, // 0x6C 'l' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 15, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x70,0x31,0x88,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 15, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x70,0x31,0x88,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, + 9, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, + 9, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 6, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, + 8, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, + 6, // 0x74 't' + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x25,0x20,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x25,0x20,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00, + 9, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00, - 9, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, + 10, // 0x7B '{' + 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, - 7, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 7, // 0x7C '|' + 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 10, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00, + 10, // 0x7D '}' + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00, - 12, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 15, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, + 15, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; - const int8u verdana18_bold[] = - { - 18, 4, 32, 128-32, - 0x00,0x00,0x13,0x00,0x26,0x00,0x4B,0x00,0x70,0x00,0x95,0x00,0xCC,0x00,0xF1,0x00,0x04,0x01, - 0x17,0x01,0x2A,0x01,0x4F,0x01,0x74,0x01,0x87,0x01,0x9A,0x01,0xAD,0x01,0xD2,0x01,0xF7,0x01, - 0x1C,0x02,0x41,0x02,0x66,0x02,0x8B,0x02,0xB0,0x02,0xD5,0x02,0xFA,0x02,0x1F,0x03,0x44,0x03, - 0x57,0x03,0x6A,0x03,0x8F,0x03,0xB4,0x03,0xD9,0x03,0xFE,0x03,0x23,0x04,0x48,0x04,0x6D,0x04, - 0x92,0x04,0xB7,0x04,0xDC,0x04,0x01,0x05,0x26,0x05,0x4B,0x05,0x5E,0x05,0x71,0x05,0x96,0x05, - 0xBB,0x05,0xE0,0x05,0x05,0x06,0x2A,0x06,0x4F,0x06,0x74,0x06,0x99,0x06,0xBE,0x06,0xE3,0x06, - 0x08,0x07,0x2D,0x07,0x52,0x07,0x77,0x07,0x9C,0x07,0xC1,0x07,0xD4,0x07,0xF9,0x07,0x0C,0x08, - 0x31,0x08,0x56,0x08,0x7B,0x08,0xA0,0x08,0xC5,0x08,0xD8,0x08,0xFD,0x08,0x22,0x09,0x35,0x09, - 0x5A,0x09,0x7F,0x09,0x92,0x09,0xA5,0x09,0xCA,0x09,0xDD,0x09,0x02,0x0A,0x27,0x0A,0x4C,0x0A, - 0x71,0x0A,0x96,0x0A,0xA9,0x0A,0xCE,0x0A,0xE1,0x0A,0x06,0x0B,0x2B,0x0B,0x50,0x0B,0x75,0x0B, - 0x9A,0x0B,0xBF,0x0B,0xE4,0x0B,0xF7,0x0B,0x1C,0x0C,0x41,0x0C, +const int8u verdana18_bold[] = +{ + 18, 4, 32, 128-32, + 0x00,0x00,0x13,0x00,0x26,0x00,0x4B,0x00,0x70,0x00,0x95,0x00,0xCC,0x00,0xF1,0x00,0x04,0x01, + 0x17,0x01,0x2A,0x01,0x4F,0x01,0x74,0x01,0x87,0x01,0x9A,0x01,0xAD,0x01,0xD2,0x01,0xF7,0x01, + 0x1C,0x02,0x41,0x02,0x66,0x02,0x8B,0x02,0xB0,0x02,0xD5,0x02,0xFA,0x02,0x1F,0x03,0x44,0x03, + 0x57,0x03,0x6A,0x03,0x8F,0x03,0xB4,0x03,0xD9,0x03,0xFE,0x03,0x23,0x04,0x48,0x04,0x6D,0x04, + 0x92,0x04,0xB7,0x04,0xDC,0x04,0x01,0x05,0x26,0x05,0x4B,0x05,0x5E,0x05,0x71,0x05,0x96,0x05, + 0xBB,0x05,0xE0,0x05,0x05,0x06,0x2A,0x06,0x4F,0x06,0x74,0x06,0x99,0x06,0xBE,0x06,0xE3,0x06, + 0x08,0x07,0x2D,0x07,0x52,0x07,0x77,0x07,0x9C,0x07,0xC1,0x07,0xD4,0x07,0xF9,0x07,0x0C,0x08, + 0x31,0x08,0x56,0x08,0x7B,0x08,0xA0,0x08,0xC5,0x08,0xD8,0x08,0xFD,0x08,0x22,0x09,0x35,0x09, + 0x5A,0x09,0x7F,0x09,0x92,0x09,0xA5,0x09,0xCA,0x09,0xDD,0x09,0x02,0x0A,0x27,0x0A,0x4C,0x0A, + 0x71,0x0A,0x96,0x0A,0xA9,0x0A,0xCE,0x0A,0xE1,0x0A,0x06,0x0B,0x2B,0x0B,0x50,0x0B,0x75,0x0B, + 0x9A,0x0B,0xBF,0x0B,0xE4,0x0B,0xF7,0x0B,0x1C,0x0C,0x41,0x0C, - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x20 ' ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, + 6, // 0x21 '!' + 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - 9, // 0x22 '"' - 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x22 '"' + 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x20,0x08,0x40,0x3F,0xF0,0x3F,0xF0,0x08,0x40,0x10,0x80,0x7F,0xE0,0x7F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x23 '#' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x20,0x08,0x40,0x3F,0xF0,0x3F,0xF0,0x08,0x40,0x10,0x80,0x7F,0xE0,0x7F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x80,0x34,0xC0,0x64,0xC0,0x64,0x00,0x3C,0x00,0x07,0x80,0x04,0xC0,0x64,0xC0,0x65,0x80,0x3F,0x00,0x04,0x00,0x04,0x00,0x00,0x00, + 11, // 0x24 '$' + 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x80,0x34,0xC0,0x64,0xC0,0x64,0x00,0x3C,0x00,0x07,0x80,0x04,0xC0,0x64,0xC0,0x65,0x80,0x3F,0x00,0x04,0x00,0x04,0x00,0x00,0x00, - 19, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x08,0x00,0x63,0x10,0x00,0x63,0x10,0x00,0x63,0x20,0x00,0x63,0x2F,0x80,0x63,0x58,0xC0,0x3E,0x98,0xC0,0x00,0x98,0xC0,0x01,0x18,0xC0,0x01,0x18,0xC0,0x02,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 19, // 0x25 '%' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x08,0x00,0x63,0x10,0x00,0x63,0x10,0x00,0x63,0x20,0x00,0x63,0x2F,0x80,0x63,0x58,0xC0,0x3E,0x98,0xC0,0x00,0x98,0xC0,0x01,0x18,0xC0,0x01,0x18,0xC0,0x02,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x60,0xC0,0x30,0xE0,0x1F,0x30,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x26 '&' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x60,0xC0,0x30,0xE0,0x1F,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 5, // 0x27 ''' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x28 '(' - 0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C,0x06, + 8, // 0x28 '(' + 0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C,0x06, - 8, // 0x29 ')' - 0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30,0x60, + 8, // 0x29 ')' + 0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30,0x60, - 11, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x2A '*' + 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x2B '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0x60,0xC0,0xC0, + 5, // 0x2C ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0x60,0xC0,0xC0, - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 7, // 0x2D '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, + 5, // 0x2E '.' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - 10, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, + 10, // 0x2F '/' + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - 11, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x30 '0' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x31 '1' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x32 '2' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x0F,0x00,0x01,0x80,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x33 '3' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x0F,0x00,0x01,0x80,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x21,0x80,0x41,0x80,0x7F,0xE0,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x34 '4' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x21,0x80,0x41,0x80,0x7F,0xE0,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x3F,0x00,0x01,0x80,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x35 '5' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x3F,0x00,0x01,0x80,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x18,0x00,0x30,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x36 '6' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x18,0x00,0x30,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x37 '7' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x38 '8' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0xC0,0x1E,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x39 '9' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0xC0,0x1E,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, + 6, // 0x3A ':' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x30,0x60,0x60, + 6, // 0x3B ';' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x30,0x60,0x60, - 13, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x3C '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x3D '=' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x3E '>' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 9, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x3F '?' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x27,0xD0,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, + 14, // 0x40 '@' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x27,0xD0,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - 12, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x41 'A' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x42 'B' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x38,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x43 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x38,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0xC0,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x61,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x44 'D' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0xC0,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x61,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x45 'E' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x46 'F' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x38,0x60,0x30,0x60,0x60,0x00,0x60,0x00,0x63,0xE0,0x60,0x60,0x60,0x60,0x30,0x60,0x38,0x60,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x47 'G' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x38,0x60,0x30,0x60,0x60,0x00,0x60,0x00,0x63,0xE0,0x60,0x60,0x60,0x60,0x30,0x60,0x38,0x60,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x48 'H' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, + 8, // 0x49 'I' + 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, - 8, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, + 8, // 0x4A 'J' + 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, - 12, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x4B 'K' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x4C 'L' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x38,0x70,0x38,0x70,0x78,0x58,0x58,0x58,0xD8,0x4C,0x98,0x4D,0x98,0x47,0x18,0x47,0x18,0x42,0x18,0x40,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x4D 'M' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x38,0x70,0x38,0x70,0x78,0x58,0x58,0x58,0xD8,0x4C,0x98,0x4D,0x98,0x47,0x18,0x47,0x18,0x42,0x18,0x40,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x70,0x20,0x58,0x20,0x4C,0x20,0x4C,0x20,0x46,0x20,0x43,0x20,0x43,0x20,0x41,0xA0,0x40,0xE0,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x4E 'N' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x70,0x20,0x58,0x20,0x4C,0x20,0x4C,0x20,0x46,0x20,0x43,0x20,0x43,0x20,0x41,0xA0,0x40,0xE0,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x4F 'O' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x50 'P' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 13, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x03,0x00,0x03,0x80,0x01,0xF0, + 13, // 0x51 'Q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x03,0x00,0x03,0x80,0x01,0xF0, - 12, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x52 'R' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0xC0,0x60,0x00,0x7C,0x00,0x3F,0x80,0x03,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x53 'S' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0xC0,0x60,0x00,0x7C,0x00,0x3F,0x80,0x03,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x54 'T' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 12, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 12, // 0x55 'U' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x56 'V' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 16, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x33,0xCC,0x32,0x4C,0x32,0x4C,0x1E,0x78,0x1C,0x38,0x1C,0x38,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00, + 16, // 0x57 'W' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x33,0xCC,0x32,0x4C,0x32,0x4C,0x1E,0x78,0x1C,0x38,0x1C,0x38,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x58 'X' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x59 'Y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x5A 'Z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x5B '[' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, + 8, // 0x5B '[' + 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, - 10, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, + 10, // 0x5C '\' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, - 8, // 0x5D ']' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, + 8, // 0x5D ']' + 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, - 13, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x5E '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00, + 11, // 0x5F '_' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00, - 11, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 11, // 0x60 '`' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x01,0x80,0x01,0x80,0x3F,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x61 'a' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x01,0x80,0x01,0x80,0x3F,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x62 'b' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, + 8, // 0x63 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, - 10, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x64 'd' + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x7F,0x80,0x60,0x00,0x60,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x65 'e' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x7F,0x80,0x60,0x00,0x60,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x30,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, + 6, // 0x66 'f' + 0x00,0x00,0x00,0x1C,0x30,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - 10, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, + 10, // 0x67 'g' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, - 10, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x68 'h' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 4, // 0x69 'i' + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 6, // 0x6A 'j' - 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, + 6, // 0x6A 'j' + 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, - 10, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x6B 'k' + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 4, // 0x6C 'l' + 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 16, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x3C,0x71,0xC6,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x00,0x00,0x00,0x00,0x00,0x00, + 16, // 0x6D 'm' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x3C,0x71,0xC6,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x6E 'n' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x6F 'o' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, + 10, // 0x70 'p' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - 10, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, + 10, // 0x71 'q' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, + 7, // 0x72 'r' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - 9, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x7E,0x00,0x3F,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x73 's' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x7E,0x00,0x3F,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 7, // 0x74 't' - 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x7E,0x30,0x30,0x30,0x30,0x30,0x30,0x1E,0x00,0x00,0x00, + 7, // 0x74 't' + 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x7E,0x30,0x30,0x30,0x30,0x30,0x30,0x1E,0x00,0x00,0x00, - 10, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x75 'u' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x76 'v' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 14, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x37,0xB0,0x34,0xB0,0x3C,0xF0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 14, // 0x77 'w' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x37,0xB0,0x34,0xB0,0x3C,0xF0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 10, // 0x78 'x' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - 10, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, + 10, // 0x79 'y' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - 9, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 9, // 0x7A 'z' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 11, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, + 11, // 0x7B '{' + 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 8, // 0x7C '|' + 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - 11, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x01,0xC0,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3C,0x00, + 11, // 0x7D '}' + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x01,0xC0,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3C,0x00, - 13, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x10,0x42,0x10,0x41,0x20,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 13, // 0x7E '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x10,0x42,0x10,0x41,0x20,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 15, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, + 15, // 0x7F '' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - 0 - }; + 0 +}; } diff --git a/deps/agg/src/agg_gsv_text.cpp b/deps/agg/src/agg_gsv_text.cpp index fb4be5a94..fac545c3f 100644 --- a/deps/agg/src/agg_gsv_text.cpp +++ b/deps/agg/src/agg_gsv_text.cpp @@ -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. // @@ -25,653 +25,653 @@ namespace agg { - int8u gsv_default_font[] = - { - 0x40,0x00,0x6c,0x0f,0x15,0x00,0x0e,0x00,0xf9,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x0d,0x0a,0x0d,0x0a,0x46,0x6f,0x6e,0x74,0x20,0x28, - 0x63,0x29,0x20,0x4d,0x69,0x63,0x72,0x6f,0x50,0x72, - 0x6f,0x66,0x20,0x32,0x37,0x20,0x53,0x65,0x70,0x74, - 0x65,0x6d,0x62,0x2e,0x31,0x39,0x38,0x39,0x00,0x0d, - 0x0a,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x02,0x00,0x12,0x00,0x34,0x00,0x46,0x00,0x94,0x00, - 0xd0,0x00,0x2e,0x01,0x3e,0x01,0x64,0x01,0x8a,0x01, - 0x98,0x01,0xa2,0x01,0xb4,0x01,0xba,0x01,0xc6,0x01, - 0xcc,0x01,0xf0,0x01,0xfa,0x01,0x18,0x02,0x38,0x02, - 0x44,0x02,0x68,0x02,0x98,0x02,0xa2,0x02,0xde,0x02, - 0x0e,0x03,0x24,0x03,0x40,0x03,0x48,0x03,0x52,0x03, - 0x5a,0x03,0x82,0x03,0xec,0x03,0xfa,0x03,0x26,0x04, - 0x4c,0x04,0x6a,0x04,0x7c,0x04,0x8a,0x04,0xb6,0x04, - 0xc4,0x04,0xca,0x04,0xe0,0x04,0xee,0x04,0xf8,0x04, - 0x0a,0x05,0x18,0x05,0x44,0x05,0x5e,0x05,0x8e,0x05, - 0xac,0x05,0xd6,0x05,0xe0,0x05,0xf6,0x05,0x00,0x06, - 0x12,0x06,0x1c,0x06,0x28,0x06,0x36,0x06,0x48,0x06, - 0x4e,0x06,0x60,0x06,0x6e,0x06,0x74,0x06,0x84,0x06, - 0xa6,0x06,0xc8,0x06,0xe6,0x06,0x08,0x07,0x2c,0x07, - 0x3c,0x07,0x68,0x07,0x7c,0x07,0x8c,0x07,0xa2,0x07, - 0xb0,0x07,0xb6,0x07,0xd8,0x07,0xec,0x07,0x10,0x08, - 0x32,0x08,0x54,0x08,0x64,0x08,0x88,0x08,0x98,0x08, - 0xac,0x08,0xb6,0x08,0xc8,0x08,0xd2,0x08,0xe4,0x08, - 0xf2,0x08,0x3e,0x09,0x48,0x09,0x94,0x09,0xc2,0x09, - 0xc4,0x09,0xd0,0x09,0xe2,0x09,0x04,0x0a,0x0e,0x0a, - 0x26,0x0a,0x34,0x0a,0x4a,0x0a,0x66,0x0a,0x70,0x0a, - 0x7e,0x0a,0x8e,0x0a,0x9a,0x0a,0xa6,0x0a,0xb4,0x0a, - 0xd8,0x0a,0xe2,0x0a,0xf6,0x0a,0x18,0x0b,0x22,0x0b, - 0x32,0x0b,0x56,0x0b,0x60,0x0b,0x6e,0x0b,0x7c,0x0b, - 0x8a,0x0b,0x9c,0x0b,0x9e,0x0b,0xb2,0x0b,0xc2,0x0b, - 0xd8,0x0b,0xf4,0x0b,0x08,0x0c,0x30,0x0c,0x56,0x0c, - 0x72,0x0c,0x90,0x0c,0xb2,0x0c,0xce,0x0c,0xe2,0x0c, - 0xfe,0x0c,0x10,0x0d,0x26,0x0d,0x36,0x0d,0x42,0x0d, - 0x4e,0x0d,0x5c,0x0d,0x78,0x0d,0x8c,0x0d,0x8e,0x0d, - 0x90,0x0d,0x92,0x0d,0x94,0x0d,0x96,0x0d,0x98,0x0d, - 0x9a,0x0d,0x9c,0x0d,0x9e,0x0d,0xa0,0x0d,0xa2,0x0d, - 0xa4,0x0d,0xa6,0x0d,0xa8,0x0d,0xaa,0x0d,0xac,0x0d, - 0xae,0x0d,0xb0,0x0d,0xb2,0x0d,0xb4,0x0d,0xb6,0x0d, - 0xb8,0x0d,0xba,0x0d,0xbc,0x0d,0xbe,0x0d,0xc0,0x0d, - 0xc2,0x0d,0xc4,0x0d,0xc6,0x0d,0xc8,0x0d,0xca,0x0d, - 0xcc,0x0d,0xce,0x0d,0xd0,0x0d,0xd2,0x0d,0xd4,0x0d, - 0xd6,0x0d,0xd8,0x0d,0xda,0x0d,0xdc,0x0d,0xde,0x0d, - 0xe0,0x0d,0xe2,0x0d,0xe4,0x0d,0xe6,0x0d,0xe8,0x0d, - 0xea,0x0d,0xec,0x0d,0x0c,0x0e,0x26,0x0e,0x48,0x0e, - 0x64,0x0e,0x88,0x0e,0x92,0x0e,0xa6,0x0e,0xb4,0x0e, - 0xd0,0x0e,0xee,0x0e,0x02,0x0f,0x16,0x0f,0x26,0x0f, - 0x3c,0x0f,0x58,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x10,0x80, - 0x05,0x95,0x00,0x72,0x00,0xfb,0xff,0x7f,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x05,0xfe,0x05,0x95,0xff,0x7f, - 0x00,0x7a,0x01,0x86,0xff,0x7a,0x01,0x87,0x01,0x7f, - 0xfe,0x7a,0x0a,0x87,0xff,0x7f,0x00,0x7a,0x01,0x86, - 0xff,0x7a,0x01,0x87,0x01,0x7f,0xfe,0x7a,0x05,0xf2, - 0x0b,0x95,0xf9,0x64,0x0d,0x9c,0xf9,0x64,0xfa,0x91, - 0x0e,0x00,0xf1,0xfa,0x0e,0x00,0x04,0xfc,0x08,0x99, - 0x00,0x63,0x04,0x9d,0x00,0x63,0x04,0x96,0xff,0x7f, - 0x01,0x7f,0x01,0x01,0x00,0x01,0xfe,0x02,0xfd,0x01, - 0xfc,0x00,0xfd,0x7f,0xfe,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x02,0x7f,0x06,0x7e,0x02,0x7f,0x02,0x7e, - 0xf2,0x89,0x02,0x7e,0x02,0x7f,0x06,0x7e,0x02,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7c,0xfe,0x7e,0xfd,0x7f, - 0xfc,0x00,0xfd,0x01,0xfe,0x02,0x00,0x01,0x01,0x01, - 0x01,0x7f,0xff,0x7f,0x10,0xfd,0x15,0x95,0xee,0x6b, - 0x05,0x95,0x02,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7f, - 0xfe,0x00,0xfe,0x02,0x00,0x02,0x01,0x02,0x02,0x01, - 0x02,0x00,0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01, - 0x02,0x01,0xfc,0xf2,0xfe,0x7f,0xff,0x7e,0x00,0x7e, - 0x02,0x7e,0x02,0x00,0x02,0x01,0x01,0x02,0x00,0x02, - 0xfe,0x02,0xfe,0x00,0x07,0xf9,0x15,0x8d,0xff,0x7f, - 0x01,0x7f,0x01,0x01,0x00,0x01,0xff,0x01,0xff,0x00, - 0xff,0x7f,0xff,0x7e,0xfe,0x7b,0xfe,0x7d,0xfe,0x7e, - 0xfe,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02,0x00,0x03, - 0x01,0x02,0x06,0x04,0x02,0x02,0x01,0x02,0x00,0x02, - 0xff,0x02,0xfe,0x01,0xfe,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7d,0x02,0x7d,0x05,0x79,0x02,0x7e,0x03,0x7f, - 0x01,0x00,0x01,0x01,0x00,0x01,0xf1,0xfe,0xfe,0x01, - 0xff,0x02,0x00,0x03,0x01,0x02,0x02,0x02,0x00,0x86, - 0x01,0x7e,0x08,0x75,0x02,0x7e,0x02,0x7f,0x05,0x80, - 0x05,0x93,0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e, - 0xff,0x7e,0xff,0x7f,0x06,0xf1,0x0b,0x99,0xfe,0x7e, - 0xfe,0x7d,0xfe,0x7c,0xff,0x7b,0x00,0x7c,0x01,0x7b, - 0x02,0x7c,0x02,0x7d,0x02,0x7e,0xfe,0x9e,0xfe,0x7c, - 0xff,0x7d,0xff,0x7b,0x00,0x7c,0x01,0x7b,0x01,0x7d, - 0x02,0x7c,0x05,0x85,0x03,0x99,0x02,0x7e,0x02,0x7d, - 0x02,0x7c,0x01,0x7b,0x00,0x7c,0xff,0x7b,0xfe,0x7c, - 0xfe,0x7d,0xfe,0x7e,0x02,0x9e,0x02,0x7c,0x01,0x7d, - 0x01,0x7b,0x00,0x7c,0xff,0x7b,0xff,0x7d,0xfe,0x7c, - 0x09,0x85,0x08,0x95,0x00,0x74,0xfb,0x89,0x0a,0x7a, - 0x00,0x86,0xf6,0x7a,0x0d,0xf4,0x0d,0x92,0x00,0x6e, - 0xf7,0x89,0x12,0x00,0x04,0xf7,0x06,0x81,0xff,0x7f, - 0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e,0xff,0x7e, - 0xff,0x7f,0x06,0x84,0x04,0x89,0x12,0x00,0x04,0xf7, - 0x05,0x82,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x05,0xfe,0x00,0xfd,0x0e,0x18,0x00,0xeb,0x09,0x95, - 0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7d,0x01,0x7b, - 0x02,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x03, - 0x01,0x05,0x00,0x03,0xff,0x05,0xfe,0x03,0xfd,0x01, - 0xfe,0x00,0x0b,0xeb,0x06,0x91,0x02,0x01,0x03,0x03, - 0x00,0x6b,0x09,0x80,0x04,0x90,0x00,0x01,0x01,0x02, - 0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7f, - 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7d,0xf6,0x76, - 0x0e,0x00,0x03,0x80,0x05,0x95,0x0b,0x00,0xfa,0x78, - 0x03,0x00,0x02,0x7f,0x01,0x7f,0x01,0x7d,0x00,0x7e, - 0xff,0x7d,0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01, - 0xff,0x01,0xff,0x02,0x11,0xfc,0x0d,0x95,0xf6,0x72, - 0x0f,0x00,0xfb,0x8e,0x00,0x6b,0x07,0x80,0x0f,0x95, - 0xf6,0x00,0xff,0x77,0x01,0x01,0x03,0x01,0x03,0x00, - 0x03,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e,0xff,0x7d, - 0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x01, - 0xff,0x02,0x11,0xfc,0x10,0x92,0xff,0x02,0xfd,0x01, - 0xfe,0x00,0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7b, - 0x01,0x7c,0x02,0x7e,0x03,0x7f,0x01,0x00,0x03,0x01, - 0x02,0x02,0x01,0x03,0x00,0x01,0xff,0x03,0xfe,0x02, - 0xfd,0x01,0xff,0x00,0xfd,0x7f,0xfe,0x7e,0xff,0x7d, - 0x10,0xf9,0x11,0x95,0xf6,0x6b,0xfc,0x95,0x0e,0x00, - 0x03,0xeb,0x08,0x95,0xfd,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7e,0x02,0x7f,0x04,0x7f,0x03,0x7f,0x02,0x7e, - 0x01,0x7e,0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f, - 0xfc,0x00,0xfd,0x01,0xff,0x01,0xff,0x02,0x00,0x03, - 0x01,0x02,0x02,0x02,0x03,0x01,0x04,0x01,0x02,0x01, - 0x01,0x02,0x00,0x02,0xff,0x02,0xfd,0x01,0xfc,0x00, - 0x0c,0xeb,0x10,0x8e,0xff,0x7d,0xfe,0x7e,0xfd,0x7f, - 0xff,0x00,0xfd,0x01,0xfe,0x02,0xff,0x03,0x00,0x01, - 0x01,0x03,0x02,0x02,0x03,0x01,0x01,0x00,0x03,0x7f, - 0x02,0x7e,0x01,0x7c,0x00,0x7b,0xff,0x7b,0xfe,0x7d, - 0xfd,0x7f,0xfe,0x00,0xfd,0x01,0xff,0x02,0x10,0xfd, - 0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x00,0xf4,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x05,0xfe,0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01, - 0xff,0x01,0x01,0xf3,0xff,0x7f,0xff,0x01,0x01,0x01, - 0x01,0x7f,0x00,0x7e,0xff,0x7e,0xff,0x7f,0x06,0x84, - 0x14,0x92,0xf0,0x77,0x10,0x77,0x04,0x80,0x04,0x8c, - 0x12,0x00,0xee,0xfa,0x12,0x00,0x04,0xfa,0x04,0x92, - 0x10,0x77,0xf0,0x77,0x14,0x80,0x03,0x90,0x00,0x01, - 0x01,0x02,0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, - 0xfc,0x7e,0x00,0x7d,0x00,0xfb,0xff,0x7f,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x09,0xfe,0x12,0x8d,0xff,0x02, - 0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xff,0x7f,0xff,0x7d, - 0x00,0x7d,0x01,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x01,0x02,0xfb,0x88,0xfe,0x7e,0xff,0x7d,0x00,0x7d, - 0x01,0x7e,0x01,0x7f,0x07,0x8b,0xff,0x78,0x00,0x7e, - 0x02,0x7f,0x02,0x00,0x02,0x02,0x01,0x03,0x00,0x02, - 0xff,0x03,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfd,0x01, - 0xfd,0x00,0xfd,0x7f,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7d,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01,0x02,0x01, - 0x01,0x01,0xfe,0x8d,0xff,0x78,0x00,0x7e,0x01,0x7f, - 0x08,0xfb,0x09,0x95,0xf8,0x6b,0x08,0x95,0x08,0x6b, - 0xf3,0x87,0x0a,0x00,0x04,0xf9,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x80, - 0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, - 0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00,0x11,0x80, - 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, - 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, - 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, - 0x02,0x01,0x02,0x02,0x01,0x02,0x03,0xfb,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x07,0x00,0x03,0x7f,0x02,0x7e, - 0x01,0x7e,0x01,0x7d,0x00,0x7b,0xff,0x7d,0xff,0x7e, - 0xfe,0x7e,0xfd,0x7f,0xf9,0x00,0x11,0x80,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00, - 0xf8,0xf5,0x0d,0x00,0x02,0x80,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00,0x06,0xf5, - 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, - 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, - 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, - 0x02,0x01,0x02,0x02,0x01,0x02,0x00,0x03,0xfb,0x80, - 0x05,0x00,0x03,0xf8,0x04,0x95,0x00,0x6b,0x0e,0x95, - 0x00,0x6b,0xf2,0x8b,0x0e,0x00,0x04,0xf5,0x04,0x95, - 0x00,0x6b,0x04,0x80,0x0c,0x95,0x00,0x70,0xff,0x7d, - 0xff,0x7f,0xfe,0x7f,0xfe,0x00,0xfe,0x01,0xff,0x01, - 0xff,0x03,0x00,0x02,0x0e,0xf9,0x04,0x95,0x00,0x6b, - 0x0e,0x95,0xf2,0x72,0x05,0x85,0x09,0x74,0x03,0x80, - 0x04,0x95,0x00,0x6b,0x00,0x80,0x0c,0x00,0x01,0x80, - 0x04,0x95,0x00,0x6b,0x00,0x95,0x08,0x6b,0x08,0x95, - 0xf8,0x6b,0x08,0x95,0x00,0x6b,0x04,0x80,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x0e,0x6b,0x00,0x95,0x00,0x6b, - 0x04,0x80,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, - 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, - 0xfe,0x01,0xfc,0x00,0x0d,0xeb,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, - 0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00, - 0x11,0xf6,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, - 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, - 0xfe,0x01,0xfc,0x00,0x03,0xef,0x06,0x7a,0x04,0x82, - 0x04,0x95,0x00,0x6b,0x00,0x95,0x09,0x00,0x03,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, - 0xfd,0x7f,0xf7,0x00,0x07,0x80,0x07,0x75,0x03,0x80, - 0x11,0x92,0xfe,0x02,0xfd,0x01,0xfc,0x00,0xfd,0x7f, - 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x02,0x7f, - 0x06,0x7e,0x02,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, - 0xfe,0x7e,0xfd,0x7f,0xfc,0x00,0xfd,0x01,0xfe,0x02, - 0x11,0xfd,0x08,0x95,0x00,0x6b,0xf9,0x95,0x0e,0x00, - 0x01,0xeb,0x04,0x95,0x00,0x71,0x01,0x7d,0x02,0x7e, - 0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x02,0x01,0x03, - 0x00,0x0f,0x04,0xeb,0x01,0x95,0x08,0x6b,0x08,0x95, - 0xf8,0x6b,0x09,0x80,0x02,0x95,0x05,0x6b,0x05,0x95, - 0xfb,0x6b,0x05,0x95,0x05,0x6b,0x05,0x95,0xfb,0x6b, - 0x07,0x80,0x03,0x95,0x0e,0x6b,0x00,0x95,0xf2,0x6b, - 0x11,0x80,0x01,0x95,0x08,0x76,0x00,0x75,0x08,0x95, - 0xf8,0x76,0x09,0xf5,0x11,0x95,0xf2,0x6b,0x00,0x95, - 0x0e,0x00,0xf2,0xeb,0x0e,0x00,0x03,0x80,0x03,0x93, - 0x00,0x6c,0x01,0x94,0x00,0x6c,0xff,0x94,0x05,0x00, - 0xfb,0xec,0x05,0x00,0x02,0x81,0x00,0x95,0x0e,0x68, - 0x00,0x83,0x06,0x93,0x00,0x6c,0x01,0x94,0x00,0x6c, - 0xfb,0x94,0x05,0x00,0xfb,0xec,0x05,0x00,0x03,0x81, - 0x03,0x87,0x08,0x05,0x08,0x7b,0xf0,0x80,0x08,0x04, - 0x08,0x7c,0x03,0xf9,0x01,0x80,0x10,0x00,0x01,0x80, - 0x06,0x95,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x05,0xef,0x0f,0x8e,0x00,0x72, - 0x00,0x8b,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, - 0x04,0x95,0x00,0x6b,0x00,0x8b,0x02,0x02,0x02,0x01, - 0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e, - 0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00,0xfe,0x01, - 0xfe,0x02,0x0f,0xfd,0x0f,0x8b,0xfe,0x02,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x03,0xfd,0x0f,0x95,0x00,0x6b,0x00,0x8b, - 0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xfe,0x7e, - 0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e,0x02,0x7f, - 0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd,0x03,0x88, - 0x0c,0x00,0x00,0x02,0xff,0x02,0xff,0x01,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x03,0xfd,0x0a,0x95,0xfe,0x00,0xfe,0x7f, - 0xff,0x7d,0x00,0x6f,0xfd,0x8e,0x07,0x00,0x03,0xf2, - 0x0f,0x8e,0x00,0x70,0xff,0x7d,0xff,0x7f,0xfe,0x7f, - 0xfd,0x00,0xfe,0x01,0x09,0x91,0xfe,0x02,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x04,0xfd,0x04,0x95,0x00,0x6b,0x00,0x8a, - 0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d, - 0x00,0x76,0x04,0x80,0x03,0x95,0x01,0x7f,0x01,0x01, - 0xff,0x01,0xff,0x7f,0x01,0xf9,0x00,0x72,0x04,0x80, - 0x05,0x95,0x01,0x7f,0x01,0x01,0xff,0x01,0xff,0x7f, - 0x01,0xf9,0x00,0x6f,0xff,0x7d,0xfe,0x7f,0xfe,0x00, - 0x09,0x87,0x04,0x95,0x00,0x6b,0x0a,0x8e,0xf6,0x76, - 0x04,0x84,0x07,0x78,0x02,0x80,0x04,0x95,0x00,0x6b, - 0x04,0x80,0x04,0x8e,0x00,0x72,0x00,0x8a,0x03,0x03, - 0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d,0x00,0x76, - 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, - 0x01,0x7d,0x00,0x76,0x04,0x80,0x04,0x8e,0x00,0x72, - 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, - 0x01,0x7d,0x00,0x76,0x04,0x80,0x08,0x8e,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x01,0x03, - 0x00,0x02,0xff,0x03,0xfe,0x02,0xfe,0x01,0xfd,0x00, - 0x0b,0xf2,0x04,0x8e,0x00,0x6b,0x00,0x92,0x02,0x02, - 0x02,0x01,0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d, - 0x00,0x7e,0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00, - 0xfe,0x01,0xfe,0x02,0x0f,0xfd,0x0f,0x8e,0x00,0x6b, - 0x00,0x92,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, - 0x04,0x8e,0x00,0x72,0x00,0x88,0x01,0x03,0x02,0x02, - 0x02,0x01,0x03,0x00,0x01,0xf2,0x0e,0x8b,0xff,0x02, - 0xfd,0x01,0xfd,0x00,0xfd,0x7f,0xff,0x7e,0x01,0x7e, - 0x02,0x7f,0x05,0x7f,0x02,0x7f,0x01,0x7e,0x00,0x7f, - 0xff,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02, - 0x0e,0xfd,0x05,0x95,0x00,0x6f,0x01,0x7d,0x02,0x7f, - 0x02,0x00,0xf8,0x8e,0x07,0x00,0x03,0xf2,0x04,0x8e, - 0x00,0x76,0x01,0x7d,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x03,0x03,0x00,0x8a,0x00,0x72,0x04,0x80,0x02,0x8e, - 0x06,0x72,0x06,0x8e,0xfa,0x72,0x08,0x80,0x03,0x8e, - 0x04,0x72,0x04,0x8e,0xfc,0x72,0x04,0x8e,0x04,0x72, - 0x04,0x8e,0xfc,0x72,0x07,0x80,0x03,0x8e,0x0b,0x72, - 0x00,0x8e,0xf5,0x72,0x0e,0x80,0x02,0x8e,0x06,0x72, - 0x06,0x8e,0xfa,0x72,0xfe,0x7c,0xfe,0x7e,0xfe,0x7f, - 0xff,0x00,0x0f,0x87,0x0e,0x8e,0xf5,0x72,0x00,0x8e, - 0x0b,0x00,0xf5,0xf2,0x0b,0x00,0x03,0x80,0x09,0x99, - 0xfe,0x7f,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xfe,0x7e,0x01,0x8e, - 0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xfc,0x7e,0x04,0x7e,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7e,0xff,0x8e,0x02,0x7e,0x00,0x7e,0xff,0x7e, - 0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f, - 0x02,0x7f,0x05,0x87,0x04,0x95,0x00,0x77,0x00,0xfd, - 0x00,0x77,0x04,0x80,0x05,0x99,0x02,0x7f,0x01,0x7f, - 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e, - 0x00,0x7e,0x02,0x7e,0xff,0x8e,0x01,0x7e,0x00,0x7e, - 0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x04,0x7e,0xfc,0x7e,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0x01,0x8e, - 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfe,0x7f,0x09,0x87, - 0x03,0x86,0x00,0x02,0x01,0x03,0x02,0x01,0x02,0x00, - 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, - 0x01,0x02,0xee,0xfe,0x01,0x02,0x02,0x01,0x02,0x00, - 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, - 0x01,0x03,0x00,0x02,0x03,0xf4,0x10,0x80,0x03,0x80, - 0x07,0x15,0x08,0x6b,0xfe,0x85,0xf5,0x00,0x10,0xfb, - 0x0d,0x95,0xf6,0x00,0x00,0x6b,0x0a,0x00,0x02,0x02, - 0x00,0x08,0xfe,0x02,0xf6,0x00,0x0e,0xf4,0x03,0x80, - 0x00,0x15,0x0a,0x00,0x02,0x7e,0x00,0x7e,0x00,0x7d, - 0x00,0x7e,0xfe,0x7f,0xf6,0x00,0x0a,0x80,0x02,0x7e, - 0x01,0x7e,0x00,0x7d,0xff,0x7d,0xfe,0x7f,0xf6,0x00, - 0x10,0x80,0x03,0x80,0x00,0x15,0x0c,0x00,0xff,0x7e, - 0x03,0xed,0x03,0xfd,0x00,0x03,0x02,0x00,0x00,0x12, - 0x02,0x03,0x0a,0x00,0x00,0x6b,0x02,0x00,0x00,0x7d, - 0xfe,0x83,0xf4,0x00,0x11,0x80,0x0f,0x80,0xf4,0x00, - 0x00,0x15,0x0c,0x00,0xff,0xf6,0xf5,0x00,0x0f,0xf5, - 0x04,0x95,0x07,0x76,0x00,0x0a,0x07,0x80,0xf9,0x76, - 0x00,0x75,0xf8,0x80,0x07,0x0c,0x09,0xf4,0xf9,0x0c, - 0x09,0xf4,0x03,0x92,0x02,0x03,0x07,0x00,0x03,0x7d, - 0x00,0x7b,0xfc,0x7e,0x04,0x7d,0x00,0x7a,0xfd,0x7e, - 0xf9,0x00,0xfe,0x02,0x06,0x89,0x02,0x00,0x06,0xf5, - 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0x02,0x80, - 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0xf8,0x96, - 0x03,0x00,0x07,0xea,0x03,0x80,0x00,0x15,0x0c,0x80, - 0xf7,0x76,0xfd,0x00,0x03,0x80,0x0a,0x75,0x03,0x80, - 0x03,0x80,0x07,0x13,0x02,0x02,0x03,0x00,0x00,0x6b, - 0x02,0x80,0x03,0x80,0x00,0x15,0x09,0x6b,0x09,0x15, - 0x00,0x6b,0x03,0x80,0x03,0x80,0x00,0x15,0x00,0xf6, - 0x0d,0x00,0x00,0x8a,0x00,0x6b,0x03,0x80,0x07,0x80, - 0xfd,0x00,0xff,0x03,0x00,0x04,0x00,0x07,0x00,0x04, - 0x01,0x02,0x03,0x01,0x06,0x00,0x03,0x7f,0x01,0x7e, - 0x01,0x7c,0x00,0x79,0xff,0x7c,0xff,0x7d,0xfd,0x00, - 0xfa,0x00,0x0e,0x80,0x03,0x80,0x00,0x15,0x0c,0x00, - 0x00,0x6b,0x02,0x80,0x03,0x80,0x00,0x15,0x0a,0x00, - 0x02,0x7f,0x01,0x7d,0x00,0x7b,0xff,0x7e,0xfe,0x7f, - 0xf6,0x00,0x10,0xf7,0x11,0x8f,0xff,0x03,0xff,0x02, - 0xfe,0x01,0xfa,0x00,0xfd,0x7f,0xff,0x7e,0x00,0x7c, - 0x00,0x79,0x00,0x7b,0x01,0x7e,0x03,0x00,0x06,0x00, - 0x02,0x00,0x01,0x03,0x01,0x02,0x03,0xfb,0x03,0x95, - 0x0c,0x00,0xfa,0x80,0x00,0x6b,0x09,0x80,0x03,0x95, - 0x00,0x77,0x06,0x7a,0x06,0x06,0x00,0x09,0xfa,0xf1, - 0xfa,0x7a,0x0e,0x80,0x03,0x87,0x00,0x0b,0x02,0x02, - 0x03,0x00,0x02,0x7e,0x01,0x02,0x04,0x00,0x02,0x7e, - 0x00,0x75,0xfe,0x7e,0xfc,0x00,0xff,0x01,0xfe,0x7f, - 0xfd,0x00,0xfe,0x02,0x07,0x8e,0x00,0x6b,0x09,0x80, - 0x03,0x80,0x0e,0x15,0xf2,0x80,0x0e,0x6b,0x03,0x80, - 0x03,0x95,0x00,0x6b,0x0e,0x00,0x00,0x7d,0xfe,0x98, - 0x00,0x6b,0x05,0x80,0x03,0x95,0x00,0x75,0x02,0x7d, - 0x0a,0x00,0x00,0x8e,0x00,0x6b,0x02,0x80,0x03,0x95, - 0x00,0x6b,0x10,0x00,0x00,0x15,0xf8,0x80,0x00,0x6b, - 0x0a,0x80,0x03,0x95,0x00,0x6b,0x10,0x00,0x00,0x15, - 0xf8,0x80,0x00,0x6b,0x0a,0x00,0x00,0x7d,0x02,0x83, - 0x10,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, - 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0x89,0x00,0x6b, - 0x03,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, - 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0xf4,0x03,0x92, - 0x02,0x03,0x07,0x00,0x03,0x7d,0x00,0x70,0xfd,0x7e, - 0xf9,0x00,0xfe,0x02,0x03,0x89,0x09,0x00,0x02,0xf5, - 0x03,0x80,0x00,0x15,0x00,0xf5,0x07,0x00,0x00,0x08, - 0x02,0x03,0x06,0x00,0x02,0x7d,0x00,0x70,0xfe,0x7e, - 0xfa,0x00,0xfe,0x02,0x00,0x08,0x0c,0xf6,0x0f,0x80, - 0x00,0x15,0xf6,0x00,0xfe,0x7d,0x00,0x79,0x02,0x7e, - 0x0a,0x00,0xf4,0xf7,0x07,0x09,0x07,0xf7,0x03,0x8c, - 0x01,0x02,0x01,0x01,0x05,0x00,0x02,0x7f,0x01,0x7e, - 0x00,0x74,0x00,0x86,0xff,0x01,0xfe,0x01,0xfb,0x00, - 0xff,0x7f,0xff,0x7f,0x00,0x7c,0x01,0x7e,0x01,0x00, - 0x05,0x00,0x02,0x00,0x01,0x02,0x03,0xfe,0x04,0x8e, - 0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7e,0x00,0x77, - 0xff,0x7e,0xfe,0x7f,0xfc,0x00,0xfe,0x01,0xff,0x02, - 0x00,0x09,0x01,0x02,0x02,0x02,0x03,0x01,0x02,0x01, - 0x01,0x01,0x01,0x02,0x02,0xeb,0x03,0x80,0x00,0x15, - 0x03,0x00,0x02,0x7e,0x00,0x7b,0xfe,0x7e,0xfd,0x00, - 0x03,0x80,0x04,0x00,0x03,0x7e,0x00,0x78,0xfd,0x7e, - 0xf9,0x00,0x0c,0x80,0x03,0x8c,0x02,0x02,0x02,0x01, - 0x03,0x00,0x02,0x7f,0x01,0x7d,0xfe,0x7e,0xf9,0x7d, - 0xff,0x7e,0x00,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01, - 0x02,0x01,0x02,0xfe,0x0d,0x8c,0xff,0x02,0xfe,0x01, - 0xfc,0x00,0xfe,0x7f,0xff,0x7e,0x00,0x77,0x01,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x02,0x00,0x0f, - 0xff,0x02,0xfe,0x01,0xf9,0x00,0x0c,0xeb,0x03,0x88, - 0x0a,0x00,0x00,0x02,0x00,0x03,0xfe,0x02,0xfa,0x00, - 0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c,0x01,0x7f, - 0x06,0x00,0x02,0x02,0x03,0xfe,0x03,0x8f,0x06,0x77, - 0x06,0x09,0xfa,0x80,0x00,0x71,0xff,0x87,0xfb,0x79, - 0x07,0x87,0x05,0x79,0x02,0x80,0x03,0x8d,0x02,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x7d,0xfc,0x7d,0x04,0x7e, - 0x00,0x7d,0xfe,0x7e,0xfa,0x00,0xfe,0x02,0x04,0x85, - 0x02,0x00,0x06,0xf9,0x03,0x8f,0x00,0x73,0x01,0x7e, - 0x07,0x00,0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e, - 0x03,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x07,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0xf8,0x90, - 0x03,0x00,0x08,0xf0,0x03,0x80,0x00,0x15,0x00,0xf3, - 0x02,0x00,0x06,0x07,0xfa,0xf9,0x07,0x78,0x03,0x80, - 0x03,0x80,0x04,0x0c,0x02,0x03,0x04,0x00,0x00,0x71, - 0x02,0x80,0x03,0x80,0x00,0x0f,0x06,0x77,0x06,0x09, - 0x00,0x71,0x02,0x80,0x03,0x80,0x00,0x0f,0x0a,0xf1, - 0x00,0x0f,0xf6,0xf8,0x0a,0x00,0x02,0xf9,0x05,0x80, - 0xff,0x01,0xff,0x04,0x00,0x05,0x01,0x03,0x01,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x7d,0x00,0x7b,0x00,0x7c, - 0xfe,0x7f,0xfa,0x00,0x0b,0x80,0x03,0x80,0x00,0x0f, - 0x00,0xfb,0x01,0x03,0x01,0x02,0x05,0x00,0x02,0x7e, - 0x01,0x7d,0x00,0x76,0x03,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x0a,0x8f,0x02,0x7f,0x01,0x7e,0x00,0x76, - 0xff,0x7f,0xfe,0x7f,0xfb,0x00,0xff,0x01,0xff,0x01, - 0x00,0x0a,0x01,0x02,0x01,0x01,0x05,0x00,0xf9,0x80, - 0x00,0x6b,0x0c,0x86,0x0d,0x8a,0xff,0x03,0xfe,0x02, - 0xfb,0x00,0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c, - 0x01,0x7f,0x05,0x00,0x02,0x01,0x01,0x03,0x03,0xfc, - 0x03,0x80,0x00,0x0f,0x00,0xfb,0x01,0x03,0x01,0x02, - 0x04,0x00,0x01,0x7e,0x01,0x7d,0x00,0x76,0x00,0x8a, - 0x01,0x03,0x02,0x02,0x03,0x00,0x02,0x7e,0x01,0x7d, - 0x00,0x76,0x03,0x80,0x03,0x8f,0x00,0x74,0x01,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x01,0x00,0x8d, - 0x00,0x6e,0xff,0x7e,0xfe,0x7f,0xfb,0x00,0xfe,0x01, - 0x0c,0x85,0x03,0x8d,0x01,0x02,0x03,0x00,0x02,0x7e, - 0x01,0x02,0x03,0x00,0x02,0x7e,0x00,0x74,0xfe,0x7f, - 0xfd,0x00,0xff,0x01,0xfe,0x7f,0xfd,0x00,0xff,0x01, - 0x00,0x0c,0x06,0x82,0x00,0x6b,0x08,0x86,0x03,0x80, - 0x0a,0x0f,0xf6,0x80,0x0a,0x71,0x03,0x80,0x03,0x8f, - 0x00,0x73,0x01,0x7e,0x07,0x00,0x02,0x02,0x00,0x0d, - 0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82,0x03,0x8f, - 0x00,0x79,0x02,0x7e,0x08,0x00,0x00,0x89,0x00,0x71, - 0x02,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x80, - 0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00,0x02,0x02, - 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00,0x02,0x02, - 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82, - 0x03,0x8d,0x00,0x02,0x02,0x00,0x00,0x71,0x08,0x00, - 0x02,0x02,0x00,0x06,0xfe,0x02,0xf8,0x00,0x0c,0xf6, - 0x03,0x8f,0x00,0x71,0x07,0x00,0x02,0x02,0x00,0x06, - 0xfe,0x02,0xf9,0x00,0x0c,0x85,0x00,0x71,0x02,0x80, - 0x03,0x8f,0x00,0x71,0x07,0x00,0x03,0x02,0x00,0x06, - 0xfd,0x02,0xf9,0x00,0x0c,0xf6,0x03,0x8d,0x02,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfa,0x00, - 0xfe,0x02,0x04,0x85,0x06,0x00,0x02,0xf9,0x03,0x80, - 0x00,0x0f,0x00,0xf8,0x04,0x00,0x00,0x06,0x02,0x02, - 0x04,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfc,0x00, - 0xfe,0x02,0x00,0x05,0x0a,0xf9,0x0d,0x80,0x00,0x0f, - 0xf7,0x00,0xff,0x7e,0x00,0x7b,0x01,0x7e,0x09,0x00, - 0xf6,0xfa,0x04,0x06,0x08,0xfa - }; +int8u gsv_default_font[] = +{ + 0x40,0x00,0x6c,0x0f,0x15,0x00,0x0e,0x00,0xf9,0xff, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0d,0x0a,0x0d,0x0a,0x46,0x6f,0x6e,0x74,0x20,0x28, + 0x63,0x29,0x20,0x4d,0x69,0x63,0x72,0x6f,0x50,0x72, + 0x6f,0x66,0x20,0x32,0x37,0x20,0x53,0x65,0x70,0x74, + 0x65,0x6d,0x62,0x2e,0x31,0x39,0x38,0x39,0x00,0x0d, + 0x0a,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x02,0x00,0x12,0x00,0x34,0x00,0x46,0x00,0x94,0x00, + 0xd0,0x00,0x2e,0x01,0x3e,0x01,0x64,0x01,0x8a,0x01, + 0x98,0x01,0xa2,0x01,0xb4,0x01,0xba,0x01,0xc6,0x01, + 0xcc,0x01,0xf0,0x01,0xfa,0x01,0x18,0x02,0x38,0x02, + 0x44,0x02,0x68,0x02,0x98,0x02,0xa2,0x02,0xde,0x02, + 0x0e,0x03,0x24,0x03,0x40,0x03,0x48,0x03,0x52,0x03, + 0x5a,0x03,0x82,0x03,0xec,0x03,0xfa,0x03,0x26,0x04, + 0x4c,0x04,0x6a,0x04,0x7c,0x04,0x8a,0x04,0xb6,0x04, + 0xc4,0x04,0xca,0x04,0xe0,0x04,0xee,0x04,0xf8,0x04, + 0x0a,0x05,0x18,0x05,0x44,0x05,0x5e,0x05,0x8e,0x05, + 0xac,0x05,0xd6,0x05,0xe0,0x05,0xf6,0x05,0x00,0x06, + 0x12,0x06,0x1c,0x06,0x28,0x06,0x36,0x06,0x48,0x06, + 0x4e,0x06,0x60,0x06,0x6e,0x06,0x74,0x06,0x84,0x06, + 0xa6,0x06,0xc8,0x06,0xe6,0x06,0x08,0x07,0x2c,0x07, + 0x3c,0x07,0x68,0x07,0x7c,0x07,0x8c,0x07,0xa2,0x07, + 0xb0,0x07,0xb6,0x07,0xd8,0x07,0xec,0x07,0x10,0x08, + 0x32,0x08,0x54,0x08,0x64,0x08,0x88,0x08,0x98,0x08, + 0xac,0x08,0xb6,0x08,0xc8,0x08,0xd2,0x08,0xe4,0x08, + 0xf2,0x08,0x3e,0x09,0x48,0x09,0x94,0x09,0xc2,0x09, + 0xc4,0x09,0xd0,0x09,0xe2,0x09,0x04,0x0a,0x0e,0x0a, + 0x26,0x0a,0x34,0x0a,0x4a,0x0a,0x66,0x0a,0x70,0x0a, + 0x7e,0x0a,0x8e,0x0a,0x9a,0x0a,0xa6,0x0a,0xb4,0x0a, + 0xd8,0x0a,0xe2,0x0a,0xf6,0x0a,0x18,0x0b,0x22,0x0b, + 0x32,0x0b,0x56,0x0b,0x60,0x0b,0x6e,0x0b,0x7c,0x0b, + 0x8a,0x0b,0x9c,0x0b,0x9e,0x0b,0xb2,0x0b,0xc2,0x0b, + 0xd8,0x0b,0xf4,0x0b,0x08,0x0c,0x30,0x0c,0x56,0x0c, + 0x72,0x0c,0x90,0x0c,0xb2,0x0c,0xce,0x0c,0xe2,0x0c, + 0xfe,0x0c,0x10,0x0d,0x26,0x0d,0x36,0x0d,0x42,0x0d, + 0x4e,0x0d,0x5c,0x0d,0x78,0x0d,0x8c,0x0d,0x8e,0x0d, + 0x90,0x0d,0x92,0x0d,0x94,0x0d,0x96,0x0d,0x98,0x0d, + 0x9a,0x0d,0x9c,0x0d,0x9e,0x0d,0xa0,0x0d,0xa2,0x0d, + 0xa4,0x0d,0xa6,0x0d,0xa8,0x0d,0xaa,0x0d,0xac,0x0d, + 0xae,0x0d,0xb0,0x0d,0xb2,0x0d,0xb4,0x0d,0xb6,0x0d, + 0xb8,0x0d,0xba,0x0d,0xbc,0x0d,0xbe,0x0d,0xc0,0x0d, + 0xc2,0x0d,0xc4,0x0d,0xc6,0x0d,0xc8,0x0d,0xca,0x0d, + 0xcc,0x0d,0xce,0x0d,0xd0,0x0d,0xd2,0x0d,0xd4,0x0d, + 0xd6,0x0d,0xd8,0x0d,0xda,0x0d,0xdc,0x0d,0xde,0x0d, + 0xe0,0x0d,0xe2,0x0d,0xe4,0x0d,0xe6,0x0d,0xe8,0x0d, + 0xea,0x0d,0xec,0x0d,0x0c,0x0e,0x26,0x0e,0x48,0x0e, + 0x64,0x0e,0x88,0x0e,0x92,0x0e,0xa6,0x0e,0xb4,0x0e, + 0xd0,0x0e,0xee,0x0e,0x02,0x0f,0x16,0x0f,0x26,0x0f, + 0x3c,0x0f,0x58,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, + 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, + 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, + 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x10,0x80, + 0x05,0x95,0x00,0x72,0x00,0xfb,0xff,0x7f,0x01,0x7f, + 0x01,0x01,0xff,0x01,0x05,0xfe,0x05,0x95,0xff,0x7f, + 0x00,0x7a,0x01,0x86,0xff,0x7a,0x01,0x87,0x01,0x7f, + 0xfe,0x7a,0x0a,0x87,0xff,0x7f,0x00,0x7a,0x01,0x86, + 0xff,0x7a,0x01,0x87,0x01,0x7f,0xfe,0x7a,0x05,0xf2, + 0x0b,0x95,0xf9,0x64,0x0d,0x9c,0xf9,0x64,0xfa,0x91, + 0x0e,0x00,0xf1,0xfa,0x0e,0x00,0x04,0xfc,0x08,0x99, + 0x00,0x63,0x04,0x9d,0x00,0x63,0x04,0x96,0xff,0x7f, + 0x01,0x7f,0x01,0x01,0x00,0x01,0xfe,0x02,0xfd,0x01, + 0xfc,0x00,0xfd,0x7f,0xfe,0x7e,0x00,0x7e,0x01,0x7e, + 0x01,0x7f,0x02,0x7f,0x06,0x7e,0x02,0x7f,0x02,0x7e, + 0xf2,0x89,0x02,0x7e,0x02,0x7f,0x06,0x7e,0x02,0x7f, + 0x01,0x7f,0x01,0x7e,0x00,0x7c,0xfe,0x7e,0xfd,0x7f, + 0xfc,0x00,0xfd,0x01,0xfe,0x02,0x00,0x01,0x01,0x01, + 0x01,0x7f,0xff,0x7f,0x10,0xfd,0x15,0x95,0xee,0x6b, + 0x05,0x95,0x02,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7f, + 0xfe,0x00,0xfe,0x02,0x00,0x02,0x01,0x02,0x02,0x01, + 0x02,0x00,0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01, + 0x02,0x01,0xfc,0xf2,0xfe,0x7f,0xff,0x7e,0x00,0x7e, + 0x02,0x7e,0x02,0x00,0x02,0x01,0x01,0x02,0x00,0x02, + 0xfe,0x02,0xfe,0x00,0x07,0xf9,0x15,0x8d,0xff,0x7f, + 0x01,0x7f,0x01,0x01,0x00,0x01,0xff,0x01,0xff,0x00, + 0xff,0x7f,0xff,0x7e,0xfe,0x7b,0xfe,0x7d,0xfe,0x7e, + 0xfe,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02,0x00,0x03, + 0x01,0x02,0x06,0x04,0x02,0x02,0x01,0x02,0x00,0x02, + 0xff,0x02,0xfe,0x01,0xfe,0x7f,0xff,0x7e,0x00,0x7e, + 0x01,0x7d,0x02,0x7d,0x05,0x79,0x02,0x7e,0x03,0x7f, + 0x01,0x00,0x01,0x01,0x00,0x01,0xf1,0xfe,0xfe,0x01, + 0xff,0x02,0x00,0x03,0x01,0x02,0x02,0x02,0x00,0x86, + 0x01,0x7e,0x08,0x75,0x02,0x7e,0x02,0x7f,0x05,0x80, + 0x05,0x93,0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e, + 0xff,0x7e,0xff,0x7f,0x06,0xf1,0x0b,0x99,0xfe,0x7e, + 0xfe,0x7d,0xfe,0x7c,0xff,0x7b,0x00,0x7c,0x01,0x7b, + 0x02,0x7c,0x02,0x7d,0x02,0x7e,0xfe,0x9e,0xfe,0x7c, + 0xff,0x7d,0xff,0x7b,0x00,0x7c,0x01,0x7b,0x01,0x7d, + 0x02,0x7c,0x05,0x85,0x03,0x99,0x02,0x7e,0x02,0x7d, + 0x02,0x7c,0x01,0x7b,0x00,0x7c,0xff,0x7b,0xfe,0x7c, + 0xfe,0x7d,0xfe,0x7e,0x02,0x9e,0x02,0x7c,0x01,0x7d, + 0x01,0x7b,0x00,0x7c,0xff,0x7b,0xff,0x7d,0xfe,0x7c, + 0x09,0x85,0x08,0x95,0x00,0x74,0xfb,0x89,0x0a,0x7a, + 0x00,0x86,0xf6,0x7a,0x0d,0xf4,0x0d,0x92,0x00,0x6e, + 0xf7,0x89,0x12,0x00,0x04,0xf7,0x06,0x81,0xff,0x7f, + 0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e,0xff,0x7e, + 0xff,0x7f,0x06,0x84,0x04,0x89,0x12,0x00,0x04,0xf7, + 0x05,0x82,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, + 0x05,0xfe,0x00,0xfd,0x0e,0x18,0x00,0xeb,0x09,0x95, + 0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7d,0x01,0x7b, + 0x02,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x03, + 0x01,0x05,0x00,0x03,0xff,0x05,0xfe,0x03,0xfd,0x01, + 0xfe,0x00,0x0b,0xeb,0x06,0x91,0x02,0x01,0x03,0x03, + 0x00,0x6b,0x09,0x80,0x04,0x90,0x00,0x01,0x01,0x02, + 0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7f, + 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7d,0xf6,0x76, + 0x0e,0x00,0x03,0x80,0x05,0x95,0x0b,0x00,0xfa,0x78, + 0x03,0x00,0x02,0x7f,0x01,0x7f,0x01,0x7d,0x00,0x7e, + 0xff,0x7d,0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01, + 0xff,0x01,0xff,0x02,0x11,0xfc,0x0d,0x95,0xf6,0x72, + 0x0f,0x00,0xfb,0x8e,0x00,0x6b,0x07,0x80,0x0f,0x95, + 0xf6,0x00,0xff,0x77,0x01,0x01,0x03,0x01,0x03,0x00, + 0x03,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e,0xff,0x7d, + 0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x01, + 0xff,0x02,0x11,0xfc,0x10,0x92,0xff,0x02,0xfd,0x01, + 0xfe,0x00,0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7b, + 0x01,0x7c,0x02,0x7e,0x03,0x7f,0x01,0x00,0x03,0x01, + 0x02,0x02,0x01,0x03,0x00,0x01,0xff,0x03,0xfe,0x02, + 0xfd,0x01,0xff,0x00,0xfd,0x7f,0xfe,0x7e,0xff,0x7d, + 0x10,0xf9,0x11,0x95,0xf6,0x6b,0xfc,0x95,0x0e,0x00, + 0x03,0xeb,0x08,0x95,0xfd,0x7f,0xff,0x7e,0x00,0x7e, + 0x01,0x7e,0x02,0x7f,0x04,0x7f,0x03,0x7f,0x02,0x7e, + 0x01,0x7e,0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f, + 0xfc,0x00,0xfd,0x01,0xff,0x01,0xff,0x02,0x00,0x03, + 0x01,0x02,0x02,0x02,0x03,0x01,0x04,0x01,0x02,0x01, + 0x01,0x02,0x00,0x02,0xff,0x02,0xfd,0x01,0xfc,0x00, + 0x0c,0xeb,0x10,0x8e,0xff,0x7d,0xfe,0x7e,0xfd,0x7f, + 0xff,0x00,0xfd,0x01,0xfe,0x02,0xff,0x03,0x00,0x01, + 0x01,0x03,0x02,0x02,0x03,0x01,0x01,0x00,0x03,0x7f, + 0x02,0x7e,0x01,0x7c,0x00,0x7b,0xff,0x7b,0xfe,0x7d, + 0xfd,0x7f,0xfe,0x00,0xfd,0x01,0xff,0x02,0x10,0xfd, + 0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, + 0x00,0xf4,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, + 0x05,0xfe,0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01, + 0xff,0x01,0x01,0xf3,0xff,0x7f,0xff,0x01,0x01,0x01, + 0x01,0x7f,0x00,0x7e,0xff,0x7e,0xff,0x7f,0x06,0x84, + 0x14,0x92,0xf0,0x77,0x10,0x77,0x04,0x80,0x04,0x8c, + 0x12,0x00,0xee,0xfa,0x12,0x00,0x04,0xfa,0x04,0x92, + 0x10,0x77,0xf0,0x77,0x14,0x80,0x03,0x90,0x00,0x01, + 0x01,0x02,0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f, + 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, + 0xfc,0x7e,0x00,0x7d,0x00,0xfb,0xff,0x7f,0x01,0x7f, + 0x01,0x01,0xff,0x01,0x09,0xfe,0x12,0x8d,0xff,0x02, + 0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xff,0x7f,0xff,0x7d, + 0x00,0x7d,0x01,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, + 0x01,0x02,0xfb,0x88,0xfe,0x7e,0xff,0x7d,0x00,0x7d, + 0x01,0x7e,0x01,0x7f,0x07,0x8b,0xff,0x78,0x00,0x7e, + 0x02,0x7f,0x02,0x00,0x02,0x02,0x01,0x03,0x00,0x02, + 0xff,0x03,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfd,0x01, + 0xfd,0x00,0xfd,0x7f,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, + 0xff,0x7d,0x00,0x7d,0x01,0x7d,0x01,0x7e,0x02,0x7e, + 0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01,0x02,0x01, + 0x01,0x01,0xfe,0x8d,0xff,0x78,0x00,0x7e,0x01,0x7f, + 0x08,0xfb,0x09,0x95,0xf8,0x6b,0x08,0x95,0x08,0x6b, + 0xf3,0x87,0x0a,0x00,0x04,0xf9,0x04,0x95,0x00,0x6b, + 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, + 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x80, + 0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, + 0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00,0x11,0x80, + 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, + 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, + 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, + 0x02,0x01,0x02,0x02,0x01,0x02,0x03,0xfb,0x04,0x95, + 0x00,0x6b,0x00,0x95,0x07,0x00,0x03,0x7f,0x02,0x7e, + 0x01,0x7e,0x01,0x7d,0x00,0x7b,0xff,0x7d,0xff,0x7e, + 0xfe,0x7e,0xfd,0x7f,0xf9,0x00,0x11,0x80,0x04,0x95, + 0x00,0x6b,0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00, + 0xf8,0xf5,0x0d,0x00,0x02,0x80,0x04,0x95,0x00,0x6b, + 0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00,0x06,0xf5, + 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, + 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, + 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, + 0x02,0x01,0x02,0x02,0x01,0x02,0x00,0x03,0xfb,0x80, + 0x05,0x00,0x03,0xf8,0x04,0x95,0x00,0x6b,0x0e,0x95, + 0x00,0x6b,0xf2,0x8b,0x0e,0x00,0x04,0xf5,0x04,0x95, + 0x00,0x6b,0x04,0x80,0x0c,0x95,0x00,0x70,0xff,0x7d, + 0xff,0x7f,0xfe,0x7f,0xfe,0x00,0xfe,0x01,0xff,0x01, + 0xff,0x03,0x00,0x02,0x0e,0xf9,0x04,0x95,0x00,0x6b, + 0x0e,0x95,0xf2,0x72,0x05,0x85,0x09,0x74,0x03,0x80, + 0x04,0x95,0x00,0x6b,0x00,0x80,0x0c,0x00,0x01,0x80, + 0x04,0x95,0x00,0x6b,0x00,0x95,0x08,0x6b,0x08,0x95, + 0xf8,0x6b,0x08,0x95,0x00,0x6b,0x04,0x80,0x04,0x95, + 0x00,0x6b,0x00,0x95,0x0e,0x6b,0x00,0x95,0x00,0x6b, + 0x04,0x80,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, + 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, + 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, + 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, + 0xfe,0x01,0xfc,0x00,0x0d,0xeb,0x04,0x95,0x00,0x6b, + 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, + 0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00, + 0x11,0xf6,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, + 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, + 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, + 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, + 0xfe,0x01,0xfc,0x00,0x03,0xef,0x06,0x7a,0x04,0x82, + 0x04,0x95,0x00,0x6b,0x00,0x95,0x09,0x00,0x03,0x7f, + 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, + 0xfd,0x7f,0xf7,0x00,0x07,0x80,0x07,0x75,0x03,0x80, + 0x11,0x92,0xfe,0x02,0xfd,0x01,0xfc,0x00,0xfd,0x7f, + 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x02,0x7f, + 0x06,0x7e,0x02,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, + 0xfe,0x7e,0xfd,0x7f,0xfc,0x00,0xfd,0x01,0xfe,0x02, + 0x11,0xfd,0x08,0x95,0x00,0x6b,0xf9,0x95,0x0e,0x00, + 0x01,0xeb,0x04,0x95,0x00,0x71,0x01,0x7d,0x02,0x7e, + 0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x02,0x01,0x03, + 0x00,0x0f,0x04,0xeb,0x01,0x95,0x08,0x6b,0x08,0x95, + 0xf8,0x6b,0x09,0x80,0x02,0x95,0x05,0x6b,0x05,0x95, + 0xfb,0x6b,0x05,0x95,0x05,0x6b,0x05,0x95,0xfb,0x6b, + 0x07,0x80,0x03,0x95,0x0e,0x6b,0x00,0x95,0xf2,0x6b, + 0x11,0x80,0x01,0x95,0x08,0x76,0x00,0x75,0x08,0x95, + 0xf8,0x76,0x09,0xf5,0x11,0x95,0xf2,0x6b,0x00,0x95, + 0x0e,0x00,0xf2,0xeb,0x0e,0x00,0x03,0x80,0x03,0x93, + 0x00,0x6c,0x01,0x94,0x00,0x6c,0xff,0x94,0x05,0x00, + 0xfb,0xec,0x05,0x00,0x02,0x81,0x00,0x95,0x0e,0x68, + 0x00,0x83,0x06,0x93,0x00,0x6c,0x01,0x94,0x00,0x6c, + 0xfb,0x94,0x05,0x00,0xfb,0xec,0x05,0x00,0x03,0x81, + 0x03,0x87,0x08,0x05,0x08,0x7b,0xf0,0x80,0x08,0x04, + 0x08,0x7c,0x03,0xf9,0x01,0x80,0x10,0x00,0x01,0x80, + 0x06,0x95,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7f, + 0x01,0x01,0xff,0x01,0x05,0xef,0x0f,0x8e,0x00,0x72, + 0x00,0x8b,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, + 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, + 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, + 0x04,0x95,0x00,0x6b,0x00,0x8b,0x02,0x02,0x02,0x01, + 0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e, + 0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00,0xfe,0x01, + 0xfe,0x02,0x0f,0xfd,0x0f,0x8b,0xfe,0x02,0xfe,0x01, + 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, + 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, + 0x02,0x02,0x03,0xfd,0x0f,0x95,0x00,0x6b,0x00,0x8b, + 0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xfe,0x7e, + 0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e,0x02,0x7f, + 0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd,0x03,0x88, + 0x0c,0x00,0x00,0x02,0xff,0x02,0xff,0x01,0xfe,0x01, + 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, + 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, + 0x02,0x02,0x03,0xfd,0x0a,0x95,0xfe,0x00,0xfe,0x7f, + 0xff,0x7d,0x00,0x6f,0xfd,0x8e,0x07,0x00,0x03,0xf2, + 0x0f,0x8e,0x00,0x70,0xff,0x7d,0xff,0x7f,0xfe,0x7f, + 0xfd,0x00,0xfe,0x01,0x09,0x91,0xfe,0x02,0xfe,0x01, + 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, + 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, + 0x02,0x02,0x04,0xfd,0x04,0x95,0x00,0x6b,0x00,0x8a, + 0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d, + 0x00,0x76,0x04,0x80,0x03,0x95,0x01,0x7f,0x01,0x01, + 0xff,0x01,0xff,0x7f,0x01,0xf9,0x00,0x72,0x04,0x80, + 0x05,0x95,0x01,0x7f,0x01,0x01,0xff,0x01,0xff,0x7f, + 0x01,0xf9,0x00,0x6f,0xff,0x7d,0xfe,0x7f,0xfe,0x00, + 0x09,0x87,0x04,0x95,0x00,0x6b,0x0a,0x8e,0xf6,0x76, + 0x04,0x84,0x07,0x78,0x02,0x80,0x04,0x95,0x00,0x6b, + 0x04,0x80,0x04,0x8e,0x00,0x72,0x00,0x8a,0x03,0x03, + 0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d,0x00,0x76, + 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, + 0x01,0x7d,0x00,0x76,0x04,0x80,0x04,0x8e,0x00,0x72, + 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, + 0x01,0x7d,0x00,0x76,0x04,0x80,0x08,0x8e,0xfe,0x7f, + 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, + 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x01,0x03, + 0x00,0x02,0xff,0x03,0xfe,0x02,0xfe,0x01,0xfd,0x00, + 0x0b,0xf2,0x04,0x8e,0x00,0x6b,0x00,0x92,0x02,0x02, + 0x02,0x01,0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d, + 0x00,0x7e,0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00, + 0xfe,0x01,0xfe,0x02,0x0f,0xfd,0x0f,0x8e,0x00,0x6b, + 0x00,0x92,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, + 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, + 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, + 0x04,0x8e,0x00,0x72,0x00,0x88,0x01,0x03,0x02,0x02, + 0x02,0x01,0x03,0x00,0x01,0xf2,0x0e,0x8b,0xff,0x02, + 0xfd,0x01,0xfd,0x00,0xfd,0x7f,0xff,0x7e,0x01,0x7e, + 0x02,0x7f,0x05,0x7f,0x02,0x7f,0x01,0x7e,0x00,0x7f, + 0xff,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02, + 0x0e,0xfd,0x05,0x95,0x00,0x6f,0x01,0x7d,0x02,0x7f, + 0x02,0x00,0xf8,0x8e,0x07,0x00,0x03,0xf2,0x04,0x8e, + 0x00,0x76,0x01,0x7d,0x02,0x7f,0x03,0x00,0x02,0x01, + 0x03,0x03,0x00,0x8a,0x00,0x72,0x04,0x80,0x02,0x8e, + 0x06,0x72,0x06,0x8e,0xfa,0x72,0x08,0x80,0x03,0x8e, + 0x04,0x72,0x04,0x8e,0xfc,0x72,0x04,0x8e,0x04,0x72, + 0x04,0x8e,0xfc,0x72,0x07,0x80,0x03,0x8e,0x0b,0x72, + 0x00,0x8e,0xf5,0x72,0x0e,0x80,0x02,0x8e,0x06,0x72, + 0x06,0x8e,0xfa,0x72,0xfe,0x7c,0xfe,0x7e,0xfe,0x7f, + 0xff,0x00,0x0f,0x87,0x0e,0x8e,0xf5,0x72,0x00,0x8e, + 0x0b,0x00,0xf5,0xf2,0x0b,0x00,0x03,0x80,0x09,0x99, + 0xfe,0x7f,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, + 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xfe,0x7e,0x01,0x8e, + 0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, + 0x00,0x7e,0xff,0x7e,0xfc,0x7e,0x04,0x7e,0x01,0x7e, + 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e, + 0x01,0x7e,0xff,0x8e,0x02,0x7e,0x00,0x7e,0xff,0x7e, + 0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f, + 0x02,0x7f,0x05,0x87,0x04,0x95,0x00,0x77,0x00,0xfd, + 0x00,0x77,0x04,0x80,0x05,0x99,0x02,0x7f,0x01,0x7f, + 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e, + 0x00,0x7e,0x02,0x7e,0xff,0x8e,0x01,0x7e,0x00,0x7e, + 0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, + 0x04,0x7e,0xfc,0x7e,0xff,0x7e,0x00,0x7e,0x01,0x7e, + 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0x01,0x8e, + 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, + 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfe,0x7f,0x09,0x87, + 0x03,0x86,0x00,0x02,0x01,0x03,0x02,0x01,0x02,0x00, + 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, + 0x01,0x02,0xee,0xfe,0x01,0x02,0x02,0x01,0x02,0x00, + 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, + 0x01,0x03,0x00,0x02,0x03,0xf4,0x10,0x80,0x03,0x80, + 0x07,0x15,0x08,0x6b,0xfe,0x85,0xf5,0x00,0x10,0xfb, + 0x0d,0x95,0xf6,0x00,0x00,0x6b,0x0a,0x00,0x02,0x02, + 0x00,0x08,0xfe,0x02,0xf6,0x00,0x0e,0xf4,0x03,0x80, + 0x00,0x15,0x0a,0x00,0x02,0x7e,0x00,0x7e,0x00,0x7d, + 0x00,0x7e,0xfe,0x7f,0xf6,0x00,0x0a,0x80,0x02,0x7e, + 0x01,0x7e,0x00,0x7d,0xff,0x7d,0xfe,0x7f,0xf6,0x00, + 0x10,0x80,0x03,0x80,0x00,0x15,0x0c,0x00,0xff,0x7e, + 0x03,0xed,0x03,0xfd,0x00,0x03,0x02,0x00,0x00,0x12, + 0x02,0x03,0x0a,0x00,0x00,0x6b,0x02,0x00,0x00,0x7d, + 0xfe,0x83,0xf4,0x00,0x11,0x80,0x0f,0x80,0xf4,0x00, + 0x00,0x15,0x0c,0x00,0xff,0xf6,0xf5,0x00,0x0f,0xf5, + 0x04,0x95,0x07,0x76,0x00,0x0a,0x07,0x80,0xf9,0x76, + 0x00,0x75,0xf8,0x80,0x07,0x0c,0x09,0xf4,0xf9,0x0c, + 0x09,0xf4,0x03,0x92,0x02,0x03,0x07,0x00,0x03,0x7d, + 0x00,0x7b,0xfc,0x7e,0x04,0x7d,0x00,0x7a,0xfd,0x7e, + 0xf9,0x00,0xfe,0x02,0x06,0x89,0x02,0x00,0x06,0xf5, + 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0x02,0x80, + 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0xf8,0x96, + 0x03,0x00,0x07,0xea,0x03,0x80,0x00,0x15,0x0c,0x80, + 0xf7,0x76,0xfd,0x00,0x03,0x80,0x0a,0x75,0x03,0x80, + 0x03,0x80,0x07,0x13,0x02,0x02,0x03,0x00,0x00,0x6b, + 0x02,0x80,0x03,0x80,0x00,0x15,0x09,0x6b,0x09,0x15, + 0x00,0x6b,0x03,0x80,0x03,0x80,0x00,0x15,0x00,0xf6, + 0x0d,0x00,0x00,0x8a,0x00,0x6b,0x03,0x80,0x07,0x80, + 0xfd,0x00,0xff,0x03,0x00,0x04,0x00,0x07,0x00,0x04, + 0x01,0x02,0x03,0x01,0x06,0x00,0x03,0x7f,0x01,0x7e, + 0x01,0x7c,0x00,0x79,0xff,0x7c,0xff,0x7d,0xfd,0x00, + 0xfa,0x00,0x0e,0x80,0x03,0x80,0x00,0x15,0x0c,0x00, + 0x00,0x6b,0x02,0x80,0x03,0x80,0x00,0x15,0x0a,0x00, + 0x02,0x7f,0x01,0x7d,0x00,0x7b,0xff,0x7e,0xfe,0x7f, + 0xf6,0x00,0x10,0xf7,0x11,0x8f,0xff,0x03,0xff,0x02, + 0xfe,0x01,0xfa,0x00,0xfd,0x7f,0xff,0x7e,0x00,0x7c, + 0x00,0x79,0x00,0x7b,0x01,0x7e,0x03,0x00,0x06,0x00, + 0x02,0x00,0x01,0x03,0x01,0x02,0x03,0xfb,0x03,0x95, + 0x0c,0x00,0xfa,0x80,0x00,0x6b,0x09,0x80,0x03,0x95, + 0x00,0x77,0x06,0x7a,0x06,0x06,0x00,0x09,0xfa,0xf1, + 0xfa,0x7a,0x0e,0x80,0x03,0x87,0x00,0x0b,0x02,0x02, + 0x03,0x00,0x02,0x7e,0x01,0x02,0x04,0x00,0x02,0x7e, + 0x00,0x75,0xfe,0x7e,0xfc,0x00,0xff,0x01,0xfe,0x7f, + 0xfd,0x00,0xfe,0x02,0x07,0x8e,0x00,0x6b,0x09,0x80, + 0x03,0x80,0x0e,0x15,0xf2,0x80,0x0e,0x6b,0x03,0x80, + 0x03,0x95,0x00,0x6b,0x0e,0x00,0x00,0x7d,0xfe,0x98, + 0x00,0x6b,0x05,0x80,0x03,0x95,0x00,0x75,0x02,0x7d, + 0x0a,0x00,0x00,0x8e,0x00,0x6b,0x02,0x80,0x03,0x95, + 0x00,0x6b,0x10,0x00,0x00,0x15,0xf8,0x80,0x00,0x6b, + 0x0a,0x80,0x03,0x95,0x00,0x6b,0x10,0x00,0x00,0x15, + 0xf8,0x80,0x00,0x6b,0x0a,0x00,0x00,0x7d,0x02,0x83, + 0x10,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, + 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0x89,0x00,0x6b, + 0x03,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, + 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0xf4,0x03,0x92, + 0x02,0x03,0x07,0x00,0x03,0x7d,0x00,0x70,0xfd,0x7e, + 0xf9,0x00,0xfe,0x02,0x03,0x89,0x09,0x00,0x02,0xf5, + 0x03,0x80,0x00,0x15,0x00,0xf5,0x07,0x00,0x00,0x08, + 0x02,0x03,0x06,0x00,0x02,0x7d,0x00,0x70,0xfe,0x7e, + 0xfa,0x00,0xfe,0x02,0x00,0x08,0x0c,0xf6,0x0f,0x80, + 0x00,0x15,0xf6,0x00,0xfe,0x7d,0x00,0x79,0x02,0x7e, + 0x0a,0x00,0xf4,0xf7,0x07,0x09,0x07,0xf7,0x03,0x8c, + 0x01,0x02,0x01,0x01,0x05,0x00,0x02,0x7f,0x01,0x7e, + 0x00,0x74,0x00,0x86,0xff,0x01,0xfe,0x01,0xfb,0x00, + 0xff,0x7f,0xff,0x7f,0x00,0x7c,0x01,0x7e,0x01,0x00, + 0x05,0x00,0x02,0x00,0x01,0x02,0x03,0xfe,0x04,0x8e, + 0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7e,0x00,0x77, + 0xff,0x7e,0xfe,0x7f,0xfc,0x00,0xfe,0x01,0xff,0x02, + 0x00,0x09,0x01,0x02,0x02,0x02,0x03,0x01,0x02,0x01, + 0x01,0x01,0x01,0x02,0x02,0xeb,0x03,0x80,0x00,0x15, + 0x03,0x00,0x02,0x7e,0x00,0x7b,0xfe,0x7e,0xfd,0x00, + 0x03,0x80,0x04,0x00,0x03,0x7e,0x00,0x78,0xfd,0x7e, + 0xf9,0x00,0x0c,0x80,0x03,0x8c,0x02,0x02,0x02,0x01, + 0x03,0x00,0x02,0x7f,0x01,0x7d,0xfe,0x7e,0xf9,0x7d, + 0xff,0x7e,0x00,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01, + 0x02,0x01,0x02,0xfe,0x0d,0x8c,0xff,0x02,0xfe,0x01, + 0xfc,0x00,0xfe,0x7f,0xff,0x7e,0x00,0x77,0x01,0x7e, + 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x02,0x00,0x0f, + 0xff,0x02,0xfe,0x01,0xf9,0x00,0x0c,0xeb,0x03,0x88, + 0x0a,0x00,0x00,0x02,0x00,0x03,0xfe,0x02,0xfa,0x00, + 0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c,0x01,0x7f, + 0x06,0x00,0x02,0x02,0x03,0xfe,0x03,0x8f,0x06,0x77, + 0x06,0x09,0xfa,0x80,0x00,0x71,0xff,0x87,0xfb,0x79, + 0x07,0x87,0x05,0x79,0x02,0x80,0x03,0x8d,0x02,0x02, + 0x06,0x00,0x02,0x7e,0x00,0x7d,0xfc,0x7d,0x04,0x7e, + 0x00,0x7d,0xfe,0x7e,0xfa,0x00,0xfe,0x02,0x04,0x85, + 0x02,0x00,0x06,0xf9,0x03,0x8f,0x00,0x73,0x01,0x7e, + 0x07,0x00,0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e, + 0x03,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x07,0x00, + 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0xf8,0x90, + 0x03,0x00,0x08,0xf0,0x03,0x80,0x00,0x15,0x00,0xf3, + 0x02,0x00,0x06,0x07,0xfa,0xf9,0x07,0x78,0x03,0x80, + 0x03,0x80,0x04,0x0c,0x02,0x03,0x04,0x00,0x00,0x71, + 0x02,0x80,0x03,0x80,0x00,0x0f,0x06,0x77,0x06,0x09, + 0x00,0x71,0x02,0x80,0x03,0x80,0x00,0x0f,0x0a,0xf1, + 0x00,0x0f,0xf6,0xf8,0x0a,0x00,0x02,0xf9,0x05,0x80, + 0xff,0x01,0xff,0x04,0x00,0x05,0x01,0x03,0x01,0x02, + 0x06,0x00,0x02,0x7e,0x00,0x7d,0x00,0x7b,0x00,0x7c, + 0xfe,0x7f,0xfa,0x00,0x0b,0x80,0x03,0x80,0x00,0x0f, + 0x00,0xfb,0x01,0x03,0x01,0x02,0x05,0x00,0x02,0x7e, + 0x01,0x7d,0x00,0x76,0x03,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, + 0x10,0x80,0x0a,0x8f,0x02,0x7f,0x01,0x7e,0x00,0x76, + 0xff,0x7f,0xfe,0x7f,0xfb,0x00,0xff,0x01,0xff,0x01, + 0x00,0x0a,0x01,0x02,0x01,0x01,0x05,0x00,0xf9,0x80, + 0x00,0x6b,0x0c,0x86,0x0d,0x8a,0xff,0x03,0xfe,0x02, + 0xfb,0x00,0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c, + 0x01,0x7f,0x05,0x00,0x02,0x01,0x01,0x03,0x03,0xfc, + 0x03,0x80,0x00,0x0f,0x00,0xfb,0x01,0x03,0x01,0x02, + 0x04,0x00,0x01,0x7e,0x01,0x7d,0x00,0x76,0x00,0x8a, + 0x01,0x03,0x02,0x02,0x03,0x00,0x02,0x7e,0x01,0x7d, + 0x00,0x76,0x03,0x80,0x03,0x8f,0x00,0x74,0x01,0x7e, + 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x01,0x00,0x8d, + 0x00,0x6e,0xff,0x7e,0xfe,0x7f,0xfb,0x00,0xfe,0x01, + 0x0c,0x85,0x03,0x8d,0x01,0x02,0x03,0x00,0x02,0x7e, + 0x01,0x02,0x03,0x00,0x02,0x7e,0x00,0x74,0xfe,0x7f, + 0xfd,0x00,0xff,0x01,0xfe,0x7f,0xfd,0x00,0xff,0x01, + 0x00,0x0c,0x06,0x82,0x00,0x6b,0x08,0x86,0x03,0x80, + 0x0a,0x0f,0xf6,0x80,0x0a,0x71,0x03,0x80,0x03,0x8f, + 0x00,0x73,0x01,0x7e,0x07,0x00,0x02,0x02,0x00,0x0d, + 0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82,0x03,0x8f, + 0x00,0x79,0x02,0x7e,0x08,0x00,0x00,0x89,0x00,0x71, + 0x02,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00, + 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00, + 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x80, + 0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00,0x02,0x02, + 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00,0x02,0x02, + 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82, + 0x03,0x8d,0x00,0x02,0x02,0x00,0x00,0x71,0x08,0x00, + 0x02,0x02,0x00,0x06,0xfe,0x02,0xf8,0x00,0x0c,0xf6, + 0x03,0x8f,0x00,0x71,0x07,0x00,0x02,0x02,0x00,0x06, + 0xfe,0x02,0xf9,0x00,0x0c,0x85,0x00,0x71,0x02,0x80, + 0x03,0x8f,0x00,0x71,0x07,0x00,0x03,0x02,0x00,0x06, + 0xfd,0x02,0xf9,0x00,0x0c,0xf6,0x03,0x8d,0x02,0x02, + 0x06,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfa,0x00, + 0xfe,0x02,0x04,0x85,0x06,0x00,0x02,0xf9,0x03,0x80, + 0x00,0x0f,0x00,0xf8,0x04,0x00,0x00,0x06,0x02,0x02, + 0x04,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfc,0x00, + 0xfe,0x02,0x00,0x05,0x0a,0xf9,0x0d,0x80,0x00,0x0f, + 0xf7,0x00,0xff,0x7e,0x00,0x7b,0x01,0x7e,0x09,0x00, + 0xf6,0xfa,0x04,0x06,0x08,0xfa +}; - //------------------------------------------------------------------------- - gsv_text::gsv_text() : - m_x(0.0), - m_y(0.0), - m_start_x(0.0), - m_width(10.0), - m_height(0.0), - m_space(0.0), - m_line_space(0.0), - m_text(m_chr), - m_text_buf(), - m_cur_chr(m_chr), - m_font(gsv_default_font), - m_loaded_font(), - m_status(initial), - m_big_endian(false), - m_flip(false) - { - m_chr[0] = m_chr[1] = 0; +//------------------------------------------------------------------------- +gsv_text::gsv_text() : + m_x(0.0), + m_y(0.0), + m_start_x(0.0), + m_width(10.0), + m_height(0.0), + m_space(0.0), + m_line_space(0.0), + m_text(m_chr), + m_text_buf(), + m_cur_chr(m_chr), + m_font(gsv_default_font), + m_loaded_font(), + m_status(initial), + m_big_endian(false), + m_flip(false) +{ + m_chr[0] = m_chr[1] = 0; - int t = 1; - if(*(char*)&t == 0) m_big_endian = true; - } + int t = 1; + if(*(char*)&t == 0) m_big_endian = true; +} - //------------------------------------------------------------------------- - void gsv_text::font(const void* font) - { - m_font = font; - if(m_font == 0) m_font = &m_loaded_font[0]; - } +//------------------------------------------------------------------------- +void gsv_text::font(const void* font) +{ + m_font = font; + if(m_font == 0) m_font = &m_loaded_font[0]; +} - //------------------------------------------------------------------------- - void gsv_text::size(double height, double width) - { - m_height = height; - m_width = width; - } +//------------------------------------------------------------------------- +void gsv_text::size(double height, double width) +{ + m_height = height; + m_width = width; +} - //------------------------------------------------------------------------- - void gsv_text::space(double space) - { - m_space = space; - } +//------------------------------------------------------------------------- +void gsv_text::space(double space) +{ + m_space = space; +} - //------------------------------------------------------------------------- - void gsv_text::line_space(double line_space) - { - m_line_space = line_space; - } +//------------------------------------------------------------------------- +void gsv_text::line_space(double line_space) +{ + m_line_space = line_space; +} - //------------------------------------------------------------------------- - void gsv_text::start_point(double x, double y) - { - m_x = m_start_x = x; - m_y = y; - //if(m_flip) m_y += m_height; - } +//------------------------------------------------------------------------- +void gsv_text::start_point(double x, double y) +{ + m_x = m_start_x = x; + m_y = y; + //if(m_flip) m_y += m_height; +} - //------------------------------------------------------------------------- - void gsv_text::load_font(const char* file) +//------------------------------------------------------------------------- +void gsv_text::load_font(const char* file) +{ + m_loaded_font.resize(0); + FILE* fd = fopen(file, "rb"); + if(fd) { - m_loaded_font.resize(0); - FILE* fd = fopen(file, "rb"); - if(fd) + unsigned len; + + fseek(fd, 0l, SEEK_END); + len = ftell(fd); + fseek(fd, 0l, SEEK_SET); + if(len > 0) { - unsigned len; - - fseek(fd, 0l, SEEK_END); - len = ftell(fd); - fseek(fd, 0l, SEEK_SET); - if(len > 0) + m_loaded_font.resize(len); + if (fread(&m_loaded_font[0], 1, len, fd) == len) { - m_loaded_font.resize(len); - if (fread(&m_loaded_font[0], 1, len, fd) == len) - { - m_font = &m_loaded_font[0]; - } + m_font = &m_loaded_font[0]; } - fclose(fd); } + fclose(fd); } +} - //------------------------------------------------------------------------- - void gsv_text::text(const char* text) +//------------------------------------------------------------------------- +void gsv_text::text(const char* text) +{ + if(text == 0) { - if(text == 0) - { - m_chr[0] = 0; - m_text = m_chr; - return; - } - unsigned new_size = strlen(text) + 1; - if(new_size > m_text_buf.size()) - { - m_text_buf.resize(new_size); - } - memcpy(&m_text_buf[0], text, new_size); - m_text = &m_text_buf[0]; + m_chr[0] = 0; + m_text = m_chr; + return; } - - //------------------------------------------------------------------------- - void gsv_text::rewind(unsigned) + unsigned new_size = strlen(text) + 1; + if(new_size > m_text_buf.size()) { - m_status = initial; - if(m_font == 0) return; - - m_indices = (int8u*)m_font; - double base_height = value(m_indices + 4); - m_indices += value(m_indices); - m_glyphs = (int8*)(m_indices + 257*2); - m_h = m_height / base_height; - m_w = (m_width == 0.0) ? m_h : m_width / base_height; - if(m_flip) m_h = -m_h; - m_cur_chr = m_text; + m_text_buf.resize(new_size); } + memcpy(&m_text_buf[0], text, new_size); + m_text = &m_text_buf[0]; +} - //------------------------------------------------------------------------- - unsigned gsv_text::vertex(double* x, double* y) +//------------------------------------------------------------------------- +void gsv_text::rewind(unsigned) +{ + m_status = initial; + if(m_font == 0) return; + + m_indices = (int8u*)m_font; + double base_height = value(m_indices + 4); + m_indices += value(m_indices); + m_glyphs = (int8*)(m_indices + 257*2); + m_h = m_height / base_height; + m_w = (m_width == 0.0) ? m_h : m_width / base_height; + if(m_flip) m_h = -m_h; + m_cur_chr = m_text; +} + +//------------------------------------------------------------------------- +unsigned gsv_text::vertex(double* x, double* y) +{ + unsigned idx; + int8 yc, yf; + int dx, dy; + bool quit = false; + + while(!quit) { - unsigned idx; - int8 yc, yf; - int dx, dy; - bool quit = false; - - while(!quit) + switch(m_status) { - switch(m_status) + case initial: + if(m_font == 0) + { + quit = true; + break; + } + m_status = next_char; + + case next_char: + if(*m_cur_chr == 0) + { + quit = true; + break; + } + idx = (*m_cur_chr++) & 0xFF; + if(idx == '\n') + { + m_x = m_start_x; + m_y -= m_flip ? -m_height - m_line_space : m_height + m_line_space; + break; + } + idx <<= 1; + m_bglyph = m_glyphs + value(m_indices + idx); + m_eglyph = m_glyphs + value(m_indices + idx + 2); + m_status = start_glyph; + + case start_glyph: + *x = m_x; + *y = m_y; + m_status = glyph; + return path_cmd_move_to; + + case glyph: + if(m_bglyph >= m_eglyph) { - case initial: - if(m_font == 0) - { - quit = true; - break; - } m_status = next_char; - - case next_char: - if(*m_cur_chr == 0) - { - quit = true; - break; - } - idx = (*m_cur_chr++) & 0xFF; - if(idx == '\n') - { - m_x = m_start_x; - m_y -= m_flip ? -m_height - m_line_space : m_height + m_line_space; - break; - } - idx <<= 1; - m_bglyph = m_glyphs + value(m_indices + idx); - m_eglyph = m_glyphs + value(m_indices + idx + 2); - m_status = start_glyph; - - case start_glyph: - *x = m_x; - *y = m_y; - m_status = glyph; - return path_cmd_move_to; - - case glyph: - if(m_bglyph >= m_eglyph) - { - m_status = next_char; - m_x += m_space; - break; - } - dx = int(*m_bglyph++); - yf = (yc = *m_bglyph++) & 0x80; - yc <<= 1; - yc >>= 1; - dy = int(yc); - m_x += double(dx) * m_w; - m_y += double(dy) * m_h; - *x = m_x; - *y = m_y; - return yf ? path_cmd_move_to : path_cmd_line_to; + m_x += m_space; + break; } - + dx = int(*m_bglyph++); + yf = (yc = *m_bglyph++) & 0x80; + yc <<= 1; + yc >>= 1; + dy = int(yc); + m_x += double(dx) * m_w; + m_y += double(dy) * m_h; + *x = m_x; + *y = m_y; + return yf ? path_cmd_move_to : path_cmd_line_to; } - return path_cmd_stop; - } - //------------------------------------------------------------------------- - double gsv_text::text_width() - { - double x1, y1, x2, y2; - bounding_rect_single(*this, 0, &x1, &y1, &x2, &y2); - return x2 - x1; } + return path_cmd_stop; +} + +//------------------------------------------------------------------------- +double gsv_text::text_width() +{ + double x1, y1, x2, y2; + bounding_rect_single(*this, 0, &x1, &y1, &x2, &y2); + return x2 - x1; +} } diff --git a/deps/agg/src/agg_image_filters.cpp b/deps/agg/src/agg_image_filters.cpp index 549d9adbf..0f6191de9 100644 --- a/deps/agg/src/agg_image_filters.cpp +++ b/deps/agg/src/agg_image_filters.cpp @@ -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. // @@ -23,81 +23,81 @@ namespace agg { - //-------------------------------------------------------------------- - void image_filter_lut::realloc_lut(double radius) +//-------------------------------------------------------------------- +void image_filter_lut::realloc_lut(double radius) +{ + m_radius = radius; + m_diameter = uceil(radius) * 2; + m_start = -int(m_diameter / 2 - 1); + unsigned size = m_diameter << image_subpixel_shift; + if(size > m_weight_array.size()) { - m_radius = radius; - m_diameter = uceil(radius) * 2; - m_start = -int(m_diameter / 2 - 1); - unsigned size = m_diameter << image_subpixel_shift; - if(size > m_weight_array.size()) - { - m_weight_array.resize(size); - } + m_weight_array.resize(size); } +} - //-------------------------------------------------------------------- - // This function normalizes integer values and corrects the rounding - // errors. It doesn't do anything with the source floating point values - // (m_weight_array_dbl), it corrects only integers according to the rule - // of 1.0 which means that any sum of pixel weights must be equal to 1.0. - // So, the filter function must produce a graph of the proper shape. - //-------------------------------------------------------------------- - void image_filter_lut::normalize() +//-------------------------------------------------------------------- +// This function normalizes integer values and corrects the rounding +// errors. It doesn't do anything with the source floating point values +// (m_weight_array_dbl), it corrects only integers according to the rule +// of 1.0 which means that any sum of pixel weights must be equal to 1.0. +// So, the filter function must produce a graph of the proper shape. +//-------------------------------------------------------------------- +void image_filter_lut::normalize() +{ + unsigned i; + int flip = 1; + + for(i = 0; i < image_subpixel_scale; i++) { - unsigned i; - int flip = 1; - - for(i = 0; i < image_subpixel_scale; i++) + for(;;) { - for(;;) + int sum = 0; + unsigned j; + for(j = 0; j < m_diameter; j++) { - int sum = 0; - unsigned j; - for(j = 0; j < m_diameter; j++) + sum += m_weight_array[j * image_subpixel_scale + i]; + } + + if(sum == image_filter_scale) break; + + double k = double(image_filter_scale) / double(sum); + sum = 0; + for(j = 0; j < m_diameter; j++) + { + sum += m_weight_array[j * image_subpixel_scale + i] = + iround(m_weight_array[j * image_subpixel_scale + i] * k); + } + + sum -= image_filter_scale; + int inc = (sum > 0) ? -1 : 1; + + for(j = 0; j < m_diameter && sum; j++) + { + flip ^= 1; + unsigned idx = flip ? m_diameter/2 + j/2 : m_diameter/2 - j/2; + int v = m_weight_array[idx * image_subpixel_scale + i]; + if(v < image_filter_scale) { - sum += m_weight_array[j * image_subpixel_scale + i]; - } - - if(sum == image_filter_scale) break; - - double k = double(image_filter_scale) / double(sum); - sum = 0; - for(j = 0; j < m_diameter; j++) - { - sum += m_weight_array[j * image_subpixel_scale + i] = - iround(m_weight_array[j * image_subpixel_scale + i] * k); - } - - sum -= image_filter_scale; - int inc = (sum > 0) ? -1 : 1; - - for(j = 0; j < m_diameter && sum; j++) - { - flip ^= 1; - unsigned idx = flip ? m_diameter/2 + j/2 : m_diameter/2 - j/2; - int v = m_weight_array[idx * image_subpixel_scale + i]; - if(v < image_filter_scale) - { - m_weight_array[idx * image_subpixel_scale + i] += inc; - sum += inc; - } + m_weight_array[idx * image_subpixel_scale + i] += inc; + sum += inc; } } } - - unsigned pivot = m_diameter << (image_subpixel_shift - 1); - - for(i = 0; i < pivot; i++) - { - m_weight_array[pivot + i] = m_weight_array[pivot - i]; - } - unsigned end = (diameter() << image_subpixel_shift) - 1; - m_weight_array[0] = m_weight_array[end]; } + unsigned pivot = m_diameter << (image_subpixel_shift - 1); + + for(i = 0; i < pivot; i++) + { + m_weight_array[pivot + i] = m_weight_array[pivot - i]; + } + unsigned end = (diameter() << image_subpixel_shift) - 1; + m_weight_array[0] = m_weight_array[end]; +} + } diff --git a/deps/agg/src/agg_line_aa_basics.cpp b/deps/agg/src/agg_line_aa_basics.cpp index 018d65366..4d706c173 100644 --- a/deps/agg/src/agg_line_aa_basics.cpp +++ b/deps/agg/src/agg_line_aa_basics.cpp @@ -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,65 +18,65 @@ namespace agg { - //------------------------------------------------------------------------- - // The number of the octant is determined as a 3-bit value as follows: - // bit 0 = vertical flag - // bit 1 = sx < 0 - // bit 2 = sy < 0 - // - // [N] shows the number of the orthogonal quadrant - // shows the number of the diagonal quadrant - // <1> - // [1] | [0] - // . (3)011 | 001(1) . - // . | . - // . | . - // . | . - // (2)010 .|. 000(0) - // <2> ----------.+.----------- <0> - // (6)110 . | . 100(4) - // . | . - // . | . - // . | . - // (7)111 | 101(5) - // [2] | [3] - // <3> - // 0,1,2,3,4,5,6,7 - const int8u line_parameters::s_orthogonal_quadrant[8] = { 0,0,1,1,3,3,2,2 }; - const int8u line_parameters::s_diagonal_quadrant[8] = { 0,1,2,1,0,3,2,3 }; +//------------------------------------------------------------------------- +// The number of the octant is determined as a 3-bit value as follows: +// bit 0 = vertical flag +// bit 1 = sx < 0 +// bit 2 = sy < 0 +// +// [N] shows the number of the orthogonal quadrant +// shows the number of the diagonal quadrant +// <1> +// [1] | [0] +// . (3)011 | 001(1) . +// . | . +// . | . +// . | . +// (2)010 .|. 000(0) +// <2> ----------.+.----------- <0> +// (6)110 . | . 100(4) +// . | . +// . | . +// . | . +// (7)111 | 101(5) +// [2] | [3] +// <3> +// 0,1,2,3,4,5,6,7 +const int8u line_parameters::s_orthogonal_quadrant[8] = { 0,0,1,1,3,3,2,2 }; +const int8u line_parameters::s_diagonal_quadrant[8] = { 0,1,2,1,0,3,2,3 }; - //------------------------------------------------------------------------- - void bisectrix(const line_parameters& l1, - const line_parameters& l2, - int* x, int* y) +//------------------------------------------------------------------------- +void bisectrix(const line_parameters& l1, + const line_parameters& l2, + int* x, int* y) +{ + double k = double(l2.len) / double(l1.len); + double tx = l2.x2 - (l2.x1 - l1.x1) * k; + double ty = l2.y2 - (l2.y1 - l1.y1) * k; + + //All bisectrices must be on the right of the line + //If the next point is on the left (l1 => l2.2) + //then the bisectix should be rotated by 180 degrees. + if(double(l2.x2 - l2.x1) * double(l2.y1 - l1.y1) < + double(l2.y2 - l2.y1) * double(l2.x1 - l1.x1) + 100.0) { - double k = double(l2.len) / double(l1.len); - double tx = l2.x2 - (l2.x1 - l1.x1) * k; - double ty = l2.y2 - (l2.y1 - l1.y1) * k; - - //All bisectrices must be on the right of the line - //If the next point is on the left (l1 => l2.2) - //then the bisectix should be rotated by 180 degrees. - if(double(l2.x2 - l2.x1) * double(l2.y1 - l1.y1) < - double(l2.y2 - l2.y1) * double(l2.x1 - l1.x1) + 100.0) - { - tx -= (tx - l2.x1) * 2.0; - ty -= (ty - l2.y1) * 2.0; - } - - // Check if the bisectrix is too short - double dx = tx - l2.x1; - double dy = ty - l2.y1; - if((int)sqrt(dx * dx + dy * dy) < line_subpixel_scale) - { - *x = (l2.x1 + l2.x1 + (l2.y1 - l1.y1) + (l2.y2 - l2.y1)) >> 1; - *y = (l2.y1 + l2.y1 - (l2.x1 - l1.x1) - (l2.x2 - l2.x1)) >> 1; - return; - } - *x = iround(tx); - *y = iround(ty); + tx -= (tx - l2.x1) * 2.0; + ty -= (ty - l2.y1) * 2.0; } + // Check if the bisectrix is too short + double dx = tx - l2.x1; + double dy = ty - l2.y1; + if((int)sqrt(dx * dx + dy * dy) < line_subpixel_scale) + { + *x = (l2.x1 + l2.x1 + (l2.y1 - l1.y1) + (l2.y2 - l2.y1)) >> 1; + *y = (l2.y1 + l2.y1 - (l2.x1 - l1.x1) - (l2.x2 - l2.x1)) >> 1; + return; + } + *x = iround(tx); + *y = iround(ty); +} + } diff --git a/deps/agg/src/agg_line_profile_aa.cpp b/deps/agg/src/agg_line_profile_aa.cpp index 6066662cb..cb4ceb7cd 100644 --- a/deps/agg/src/agg_line_profile_aa.cpp +++ b/deps/agg/src/agg_line_profile_aa.cpp @@ -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,99 +18,99 @@ namespace agg { - //--------------------------------------------------------------------- - void line_profile_aa::width(double w) +//--------------------------------------------------------------------- +void line_profile_aa::width(double w) +{ + if(w < 0.0) w = 0.0; + + if(w < m_smoother_width) w += w; + else w += m_smoother_width; + + w *= 0.5; + + w -= m_smoother_width; + double s = m_smoother_width; + if(w < 0.0) { - if(w < 0.0) w = 0.0; + s += w; + w = 0.0; + } + set(w, s); +} - if(w < m_smoother_width) w += w; - else w += m_smoother_width; - w *= 0.5; +//--------------------------------------------------------------------- +line_profile_aa::value_type* line_profile_aa::profile(double w) +{ + m_subpixel_width = uround(w * subpixel_scale); + unsigned size = m_subpixel_width + subpixel_scale * 6; + if(size > m_profile.size()) + { + m_profile.resize(size); + } + return &m_profile[0]; +} - w -= m_smoother_width; - double s = m_smoother_width; - if(w < 0.0) - { - s += w; - w = 0.0; - } - set(w, s); + +//--------------------------------------------------------------------- +void line_profile_aa::set(double center_width, double smoother_width) +{ + double base_val = 1.0; + if(center_width == 0.0) center_width = 1.0 / subpixel_scale; + if(smoother_width == 0.0) smoother_width = 1.0 / subpixel_scale; + + double width = center_width + smoother_width; + if(width < m_min_width) + { + double k = width / m_min_width; + base_val *= k; + center_width /= k; + smoother_width /= k; } + value_type* ch = profile(center_width + smoother_width); - //--------------------------------------------------------------------- - line_profile_aa::value_type* line_profile_aa::profile(double w) + unsigned subpixel_center_width = unsigned(center_width * subpixel_scale); + unsigned subpixel_smoother_width = unsigned(smoother_width * subpixel_scale); + + value_type* ch_center = ch + subpixel_scale*2; + value_type* ch_smoother = ch_center + subpixel_center_width; + + unsigned i; + + unsigned val = m_gamma[unsigned(base_val * aa_mask)]; + ch = ch_center; + for(i = 0; i < subpixel_center_width; i++) { - m_subpixel_width = uround(w * subpixel_scale); - unsigned size = m_subpixel_width + subpixel_scale * 6; - if(size > m_profile.size()) - { - m_profile.resize(size); - } - return &m_profile[0]; + *ch++ = (value_type)val; } - - //--------------------------------------------------------------------- - void line_profile_aa::set(double center_width, double smoother_width) + for(i = 0; i < subpixel_smoother_width; i++) { - double base_val = 1.0; - if(center_width == 0.0) center_width = 1.0 / subpixel_scale; - if(smoother_width == 0.0) smoother_width = 1.0 / subpixel_scale; - - double width = center_width + smoother_width; - if(width < m_min_width) - { - double k = width / m_min_width; - base_val *= k; - center_width /= k; - smoother_width /= k; - } - - value_type* ch = profile(center_width + smoother_width); - - unsigned subpixel_center_width = unsigned(center_width * subpixel_scale); - unsigned subpixel_smoother_width = unsigned(smoother_width * subpixel_scale); - - value_type* ch_center = ch + subpixel_scale*2; - value_type* ch_smoother = ch_center + subpixel_center_width; - - unsigned i; - - unsigned val = m_gamma[unsigned(base_val * aa_mask)]; - ch = ch_center; - for(i = 0; i < subpixel_center_width; i++) - { - *ch++ = (value_type)val; - } - - for(i = 0; i < subpixel_smoother_width; i++) - { - *ch_smoother++ = - m_gamma[unsigned((base_val - - base_val * - (double(i) / subpixel_smoother_width)) * aa_mask)]; - } - - unsigned n_smoother = profile_size() - - subpixel_smoother_width - - subpixel_center_width - - subpixel_scale*2; - - val = m_gamma[0]; - for(i = 0; i < n_smoother; i++) - { - *ch_smoother++ = (value_type)val; - } - - ch = ch_center; - for(i = 0; i < subpixel_scale*2; i++) - { - *--ch = *ch_center++; - } + *ch_smoother++ = + m_gamma[unsigned((base_val - + base_val * + (double(i) / subpixel_smoother_width)) * aa_mask)]; } + unsigned n_smoother = profile_size() - + subpixel_smoother_width - + subpixel_center_width - + subpixel_scale*2; + + val = m_gamma[0]; + for(i = 0; i < n_smoother; i++) + { + *ch_smoother++ = (value_type)val; + } + + ch = ch_center; + for(i = 0; i < subpixel_scale*2; i++) + { + *--ch = *ch_center++; + } +} + } diff --git a/deps/agg/src/agg_pixfmt_rgba.cpp b/deps/agg/src/agg_pixfmt_rgba.cpp index 7dbd42648..4541e441b 100644 --- a/deps/agg/src/agg_pixfmt_rgba.cpp +++ b/deps/agg/src/agg_pixfmt_rgba.cpp @@ -9,8 +9,8 @@ namespace agg template void comp_op_rgba_hue::blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) + unsigned sr, unsigned sg, unsigned sb, + unsigned sa, unsigned cover) { if (cover < 255) { @@ -41,8 +41,8 @@ void comp_op_rgba_hue::blend_pix(value_type* p, template void comp_op_rgba_saturation::blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) + unsigned sr, unsigned sg, unsigned sb, + unsigned sa, unsigned cover) { if (cover < 255) { @@ -73,8 +73,8 @@ void comp_op_rgba_saturation::blend_pix(value_type* p, template void comp_op_rgba_color::blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) + unsigned sr, unsigned sg, unsigned sb, + unsigned sa, unsigned cover) { if (cover < 255) { @@ -106,8 +106,8 @@ void comp_op_rgba_color::blend_pix(value_type* p, template void comp_op_rgba_value::blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) + unsigned sr, unsigned sg, unsigned sb, + unsigned sa, unsigned cover) { if (cover < 255) { @@ -144,4 +144,4 @@ template struct comp_op_rgba_value; -} \ No newline at end of file +} diff --git a/deps/agg/src/agg_rounded_rect.cpp b/deps/agg/src/agg_rounded_rect.cpp index 7f68651b7..541452842 100644 --- a/deps/agg/src/agg_rounded_rect.cpp +++ b/deps/agg/src/agg_rounded_rect.cpp @@ -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. // @@ -23,141 +23,141 @@ namespace agg { - //------------------------------------------------------------------------ - rounded_rect::rounded_rect(double x1, double y1, double x2, double y2, double r) : - m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), - m_rx1(r), m_ry1(r), m_rx2(r), m_ry2(r), - m_rx3(r), m_ry3(r), m_rx4(r), m_ry4(r) +//------------------------------------------------------------------------ +rounded_rect::rounded_rect(double x1, double y1, double x2, double y2, double r) : + m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), + m_rx1(r), m_ry1(r), m_rx2(r), m_ry2(r), + m_rx3(r), m_ry3(r), m_rx4(r), m_ry4(r) +{ + if(x1 > x2) { m_x1 = x2; m_x2 = x1; } + if(y1 > y2) { m_y1 = y2; m_y2 = y1; } +} + +//-------------------------------------------------------------------- +void rounded_rect::rect(double x1, double y1, double x2, double y2) +{ + m_x1 = x1; + m_y1 = y1; + m_x2 = x2; + m_y2 = y2; + if(x1 > x2) { m_x1 = x2; m_x2 = x1; } + if(y1 > y2) { m_y1 = y2; m_y2 = y1; } +} + +//-------------------------------------------------------------------- +void rounded_rect::radius(double r) +{ + m_rx1 = m_ry1 = m_rx2 = m_ry2 = m_rx3 = m_ry3 = m_rx4 = m_ry4 = r; +} + +//-------------------------------------------------------------------- +void rounded_rect::radius(double rx, double ry) +{ + m_rx1 = m_rx2 = m_rx3 = m_rx4 = rx; + m_ry1 = m_ry2 = m_ry3 = m_ry4 = ry; +} + +//-------------------------------------------------------------------- +void rounded_rect::radius(double rx_bottom, double ry_bottom, + double rx_top, double ry_top) +{ + m_rx1 = m_rx2 = rx_bottom; + m_rx3 = m_rx4 = rx_top; + m_ry1 = m_ry2 = ry_bottom; + m_ry3 = m_ry4 = ry_top; +} + +//-------------------------------------------------------------------- +void rounded_rect::radius(double rx1, double ry1, double rx2, double ry2, + double rx3, double ry3, double rx4, double ry4) +{ + m_rx1 = rx1; m_ry1 = ry1; m_rx2 = rx2; m_ry2 = ry2; + m_rx3 = rx3; m_ry3 = ry3; m_rx4 = rx4; m_ry4 = ry4; +} + +//-------------------------------------------------------------------- +void rounded_rect::normalize_radius() +{ + double dx = fabs(m_x2 - m_x1); + double dy = fabs(m_y2 - m_y1); + + double k = 1.0; + double t; + t = dx / (m_rx1 + m_rx2); if(t < k) k = t; + t = dx / (m_rx3 + m_rx4); if(t < k) k = t; + t = dy / (m_ry1 + m_ry2); if(t < k) k = t; + t = dy / (m_ry3 + m_ry4); if(t < k) k = t; + + if(k < 1.0) { - if(x1 > x2) { m_x1 = x2; m_x2 = x1; } - if(y1 > y2) { m_y1 = y2; m_y2 = y1; } + m_rx1 *= k; m_ry1 *= k; m_rx2 *= k; m_ry2 *= k; + m_rx3 *= k; m_ry3 *= k; m_rx4 *= k; m_ry4 *= k; } +} - //-------------------------------------------------------------------- - void rounded_rect::rect(double x1, double y1, double x2, double y2) +//-------------------------------------------------------------------- +void rounded_rect::rewind(unsigned) +{ + m_status = 0; +} + +//-------------------------------------------------------------------- +unsigned rounded_rect::vertex(double* x, double* y) +{ + unsigned cmd = path_cmd_stop; + switch(m_status) { - m_x1 = x1; - m_y1 = y1; - m_x2 = x2; - m_y2 = y2; - if(x1 > x2) { m_x1 = x2; m_x2 = x1; } - if(y1 > y2) { m_y1 = y2; m_y2 = y1; } - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double r) - { - m_rx1 = m_ry1 = m_rx2 = m_ry2 = m_rx3 = m_ry3 = m_rx4 = m_ry4 = r; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx, double ry) - { - m_rx1 = m_rx2 = m_rx3 = m_rx4 = rx; - m_ry1 = m_ry2 = m_ry3 = m_ry4 = ry; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx_bottom, double ry_bottom, - double rx_top, double ry_top) - { - m_rx1 = m_rx2 = rx_bottom; - m_rx3 = m_rx4 = rx_top; - m_ry1 = m_ry2 = ry_bottom; - m_ry3 = m_ry4 = ry_top; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx1, double ry1, double rx2, double ry2, - double rx3, double ry3, double rx4, double ry4) - { - m_rx1 = rx1; m_ry1 = ry1; m_rx2 = rx2; m_ry2 = ry2; - m_rx3 = rx3; m_ry3 = ry3; m_rx4 = rx4; m_ry4 = ry4; - } - - //-------------------------------------------------------------------- - void rounded_rect::normalize_radius() - { - double dx = fabs(m_x2 - m_x1); - double dy = fabs(m_y2 - m_y1); - - double k = 1.0; - double t; - t = dx / (m_rx1 + m_rx2); if(t < k) k = t; - t = dx / (m_rx3 + m_rx4); if(t < k) k = t; - t = dy / (m_ry1 + m_ry2); if(t < k) k = t; - t = dy / (m_ry3 + m_ry4); if(t < k) k = t; - - if(k < 1.0) - { - m_rx1 *= k; m_ry1 *= k; m_rx2 *= k; m_ry2 *= k; - m_rx3 *= k; m_ry3 *= k; m_rx4 *= k; m_ry4 *= k; - } - } - - //-------------------------------------------------------------------- - void rounded_rect::rewind(unsigned) - { - m_status = 0; - } - - //-------------------------------------------------------------------- - unsigned rounded_rect::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - switch(m_status) - { - case 0: - m_arc.init(m_x1 + m_rx1, m_y1 + m_ry1, m_rx1, m_ry1, - pi, pi+pi*0.5); - m_arc.rewind(0); - m_status++; - - case 1: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return cmd; - - case 2: - m_arc.init(m_x2 - m_rx2, m_y1 + m_ry2, m_rx2, m_ry2, - pi+pi*0.5, 0.0); - m_arc.rewind(0); - m_status++; - - case 3: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 4: - m_arc.init(m_x2 - m_rx3, m_y2 - m_ry3, m_rx3, m_ry3, - 0.0, pi*0.5); - m_arc.rewind(0); - m_status++; - - case 5: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 6: - m_arc.init(m_x1 + m_rx4, m_y2 - m_ry4, m_rx4, m_ry4, - pi*0.5, pi); - m_arc.rewind(0); - m_status++; - - case 7: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 8: - cmd = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_status++; - break; - } - return cmd; + case 0: + m_arc.init(m_x1 + m_rx1, m_y1 + m_ry1, m_rx1, m_ry1, + pi, pi+pi*0.5); + m_arc.rewind(0); + m_status++; + + case 1: + cmd = m_arc.vertex(x, y); + if(is_stop(cmd)) m_status++; + else return cmd; + + case 2: + m_arc.init(m_x2 - m_rx2, m_y1 + m_ry2, m_rx2, m_ry2, + pi+pi*0.5, 0.0); + m_arc.rewind(0); + m_status++; + + case 3: + cmd = m_arc.vertex(x, y); + if(is_stop(cmd)) m_status++; + else return path_cmd_line_to; + + case 4: + m_arc.init(m_x2 - m_rx3, m_y2 - m_ry3, m_rx3, m_ry3, + 0.0, pi*0.5); + m_arc.rewind(0); + m_status++; + + case 5: + cmd = m_arc.vertex(x, y); + if(is_stop(cmd)) m_status++; + else return path_cmd_line_to; + + case 6: + m_arc.init(m_x1 + m_rx4, m_y2 - m_ry4, m_rx4, m_ry4, + pi*0.5, pi); + m_arc.rewind(0); + m_status++; + + case 7: + cmd = m_arc.vertex(x, y); + if(is_stop(cmd)) m_status++; + else return path_cmd_line_to; + + case 8: + cmd = path_cmd_end_poly | path_flags_close | path_flags_ccw; + m_status++; + break; } + return cmd; +} } diff --git a/deps/agg/src/agg_sqrt_tables.cpp b/deps/agg/src/agg_sqrt_tables.cpp index 19a1bd8cb..e8381be5c 100644 --- a/deps/agg/src/agg_sqrt_tables.cpp +++ b/deps/agg/src/agg_sqrt_tables.cpp @@ -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. // @@ -21,95 +21,95 @@ namespace agg { - int16u g_sqrt_table[1024] = //----------g_sqrt_table - { - 0, - 2048,2896,3547,4096,4579,5017,5418,5793,6144,6476,6792,7094,7384,7663,7932,8192,8444, - 8689,8927,9159,9385,9606,9822,10033,10240,10443,10642,10837,11029,11217,11403,11585, - 11765,11942,12116,12288,12457,12625,12790,12953,13114,13273,13430,13585,13738,13890, - 14040,14189,14336,14482,14626,14768,14910,15050,15188,15326,15462,15597,15731,15864, - 15995,16126,16255,16384,16512,16638,16764,16888,17012,17135,17257,17378,17498,17618, - 17736,17854,17971,18087,18203,18318,18432,18545,18658,18770,18882,18992,19102,19212, - 19321,19429,19537,19644,19750,19856,19961,20066,20170,20274,20377,20480,20582,20684, - 20785,20886,20986,21085,21185,21283,21382,21480,21577,21674,21771,21867,21962,22058, - 22153,22247,22341,22435,22528,22621,22713,22806,22897,22989,23080,23170,23261,23351, - 23440,23530,23619,23707,23796,23884,23971,24059,24146,24232,24319,24405,24491,24576, - 24661,24746,24831,24915,24999,25083,25166,25249,25332,25415,25497,25580,25661,25743, - 25824,25905,25986,26067,26147,26227,26307,26387,26466,26545,26624,26703,26781,26859, - 26937,27015,27092,27170,27247,27324,27400,27477,27553,27629,27705,27780,27856,27931, - 28006,28081,28155,28230,28304,28378,28452,28525,28599,28672,28745,28818,28891,28963, - 29035,29108,29180,29251,29323,29394,29466,29537,29608,29678,29749,29819,29890,29960, - 30030,30099,30169,30238,30308,30377,30446,30515,30583,30652,30720,30788,30856,30924, - 30992,31059,31127,31194,31261,31328,31395,31462,31529,31595,31661,31727,31794,31859, - 31925,31991,32056,32122,32187,32252,32317,32382,32446,32511,32575,32640,32704,32768, - 32832,32896,32959,33023,33086,33150,33213,33276,33339,33402,33465,33527,33590,33652, - 33714,33776,33839,33900,33962,34024,34086,34147,34208,34270,34331,34392,34453,34514, - 34574,34635,34695,34756,34816,34876,34936,34996,35056,35116,35176,35235,35295,35354, - 35413,35472,35531,35590,35649,35708,35767,35825,35884,35942,36001,36059,36117,36175, - 36233,36291,36348,36406,36464,36521,36578,36636,36693,36750,36807,36864,36921,36978, - 37034,37091,37147,37204,37260,37316,37372,37429,37485,37540,37596,37652,37708,37763, - 37819,37874,37929,37985,38040,38095,38150,38205,38260,38315,38369,38424,38478,38533, - 38587,38642,38696,38750,38804,38858,38912,38966,39020,39073,39127,39181,39234,39287, - 39341,39394,39447,39500,39553,39606,39659,39712,39765,39818,39870,39923,39975,40028, - 40080,40132,40185,40237,40289,40341,40393,40445,40497,40548,40600,40652,40703,40755, - 40806,40857,40909,40960,41011,41062,41113,41164,41215,41266,41317,41368,41418,41469, - 41519,41570,41620,41671,41721,41771,41821,41871,41922,41972,42021,42071,42121,42171, - 42221,42270,42320,42369,42419,42468,42518,42567,42616,42665,42714,42763,42813,42861, - 42910,42959,43008,43057,43105,43154,43203,43251,43300,43348,43396,43445,43493,43541, - 43589,43637,43685,43733,43781,43829,43877,43925,43972,44020,44068,44115,44163,44210, - 44258,44305,44352,44400,44447,44494,44541,44588,44635,44682,44729,44776,44823,44869, - 44916,44963,45009,45056,45103,45149,45195,45242,45288,45334,45381,45427,45473,45519, - 45565,45611,45657,45703,45749,45795,45840,45886,45932,45977,46023,46069,46114,46160, - 46205,46250,46296,46341,46386,46431,46477,46522,46567,46612,46657,46702,46746,46791, - 46836,46881,46926,46970,47015,47059,47104,47149,47193,47237,47282,47326,47370,47415, - 47459,47503,47547,47591,47635,47679,47723,47767,47811,47855,47899,47942,47986,48030, - 48074,48117,48161,48204,48248,48291,48335,48378,48421,48465,48508,48551,48594,48637, - 48680,48723,48766,48809,48852,48895,48938,48981,49024,49067,49109,49152,49195,49237, - 49280,49322,49365,49407,49450,49492,49535,49577,49619,49661,49704,49746,49788,49830, - 49872,49914,49956,49998,50040,50082,50124,50166,50207,50249,50291,50332,50374,50416, - 50457,50499,50540,50582,50623,50665,50706,50747,50789,50830,50871,50912,50954,50995, - 51036,51077,51118,51159,51200,51241,51282,51323,51364,51404,51445,51486,51527,51567, - 51608,51649,51689,51730,51770,51811,51851,51892,51932,51972,52013,52053,52093,52134, - 52174,52214,52254,52294,52334,52374,52414,52454,52494,52534,52574,52614,52654,52694, - 52734,52773,52813,52853,52892,52932,52972,53011,53051,53090,53130,53169,53209,53248, - 53287,53327,53366,53405,53445,53484,53523,53562,53601,53640,53679,53719,53758,53797, - 53836,53874,53913,53952,53991,54030,54069,54108,54146,54185,54224,54262,54301,54340, - 54378,54417,54455,54494,54532,54571,54609,54647,54686,54724,54762,54801,54839,54877, - 54915,54954,54992,55030,55068,55106,55144,55182,55220,55258,55296,55334,55372,55410, - 55447,55485,55523,55561,55599,55636,55674,55712,55749,55787,55824,55862,55900,55937, - 55975,56012,56049,56087,56124,56162,56199,56236,56273,56311,56348,56385,56422,56459, - 56497,56534,56571,56608,56645,56682,56719,56756,56793,56830,56867,56903,56940,56977, - 57014,57051,57087,57124,57161,57198,57234,57271,57307,57344,57381,57417,57454,57490, - 57527,57563,57599,57636,57672,57709,57745,57781,57817,57854,57890,57926,57962,57999, - 58035,58071,58107,58143,58179,58215,58251,58287,58323,58359,58395,58431,58467,58503, - 58538,58574,58610,58646,58682,58717,58753,58789,58824,58860,58896,58931,58967,59002, - 59038,59073,59109,59144,59180,59215,59251,59286,59321,59357,59392,59427,59463,59498, - 59533,59568,59603,59639,59674,59709,59744,59779,59814,59849,59884,59919,59954,59989, - 60024,60059,60094,60129,60164,60199,60233,60268,60303,60338,60373,60407,60442,60477, - 60511,60546,60581,60615,60650,60684,60719,60753,60788,60822,60857,60891,60926,60960, - 60995,61029,61063,61098,61132,61166,61201,61235,61269,61303,61338,61372,61406,61440, - 61474,61508,61542,61576,61610,61644,61678,61712,61746,61780,61814,61848,61882,61916, - 61950,61984,62018,62051,62085,62119,62153,62186,62220,62254,62287,62321,62355,62388, - 62422,62456,62489,62523,62556,62590,62623,62657,62690,62724,62757,62790,62824,62857, - 62891,62924,62957,62991,63024,63057,63090,63124,63157,63190,63223,63256,63289,63323, - 63356,63389,63422,63455,63488,63521,63554,63587,63620,63653,63686,63719,63752,63785, - 63817,63850,63883,63916,63949,63982,64014,64047,64080,64113,64145,64178,64211,64243, - 64276,64309,64341,64374,64406,64439,64471,64504,64536,64569,64601,64634,64666,64699, - 64731,64763,64796,64828,64861,64893,64925,64957,64990,65022,65054,65086,65119,65151, - 65183,65215,65247,65279,65312,65344,65376,65408,65440,65472,65504 - }; +int16u g_sqrt_table[1024] = //----------g_sqrt_table +{ + 0, + 2048,2896,3547,4096,4579,5017,5418,5793,6144,6476,6792,7094,7384,7663,7932,8192,8444, + 8689,8927,9159,9385,9606,9822,10033,10240,10443,10642,10837,11029,11217,11403,11585, + 11765,11942,12116,12288,12457,12625,12790,12953,13114,13273,13430,13585,13738,13890, + 14040,14189,14336,14482,14626,14768,14910,15050,15188,15326,15462,15597,15731,15864, + 15995,16126,16255,16384,16512,16638,16764,16888,17012,17135,17257,17378,17498,17618, + 17736,17854,17971,18087,18203,18318,18432,18545,18658,18770,18882,18992,19102,19212, + 19321,19429,19537,19644,19750,19856,19961,20066,20170,20274,20377,20480,20582,20684, + 20785,20886,20986,21085,21185,21283,21382,21480,21577,21674,21771,21867,21962,22058, + 22153,22247,22341,22435,22528,22621,22713,22806,22897,22989,23080,23170,23261,23351, + 23440,23530,23619,23707,23796,23884,23971,24059,24146,24232,24319,24405,24491,24576, + 24661,24746,24831,24915,24999,25083,25166,25249,25332,25415,25497,25580,25661,25743, + 25824,25905,25986,26067,26147,26227,26307,26387,26466,26545,26624,26703,26781,26859, + 26937,27015,27092,27170,27247,27324,27400,27477,27553,27629,27705,27780,27856,27931, + 28006,28081,28155,28230,28304,28378,28452,28525,28599,28672,28745,28818,28891,28963, + 29035,29108,29180,29251,29323,29394,29466,29537,29608,29678,29749,29819,29890,29960, + 30030,30099,30169,30238,30308,30377,30446,30515,30583,30652,30720,30788,30856,30924, + 30992,31059,31127,31194,31261,31328,31395,31462,31529,31595,31661,31727,31794,31859, + 31925,31991,32056,32122,32187,32252,32317,32382,32446,32511,32575,32640,32704,32768, + 32832,32896,32959,33023,33086,33150,33213,33276,33339,33402,33465,33527,33590,33652, + 33714,33776,33839,33900,33962,34024,34086,34147,34208,34270,34331,34392,34453,34514, + 34574,34635,34695,34756,34816,34876,34936,34996,35056,35116,35176,35235,35295,35354, + 35413,35472,35531,35590,35649,35708,35767,35825,35884,35942,36001,36059,36117,36175, + 36233,36291,36348,36406,36464,36521,36578,36636,36693,36750,36807,36864,36921,36978, + 37034,37091,37147,37204,37260,37316,37372,37429,37485,37540,37596,37652,37708,37763, + 37819,37874,37929,37985,38040,38095,38150,38205,38260,38315,38369,38424,38478,38533, + 38587,38642,38696,38750,38804,38858,38912,38966,39020,39073,39127,39181,39234,39287, + 39341,39394,39447,39500,39553,39606,39659,39712,39765,39818,39870,39923,39975,40028, + 40080,40132,40185,40237,40289,40341,40393,40445,40497,40548,40600,40652,40703,40755, + 40806,40857,40909,40960,41011,41062,41113,41164,41215,41266,41317,41368,41418,41469, + 41519,41570,41620,41671,41721,41771,41821,41871,41922,41972,42021,42071,42121,42171, + 42221,42270,42320,42369,42419,42468,42518,42567,42616,42665,42714,42763,42813,42861, + 42910,42959,43008,43057,43105,43154,43203,43251,43300,43348,43396,43445,43493,43541, + 43589,43637,43685,43733,43781,43829,43877,43925,43972,44020,44068,44115,44163,44210, + 44258,44305,44352,44400,44447,44494,44541,44588,44635,44682,44729,44776,44823,44869, + 44916,44963,45009,45056,45103,45149,45195,45242,45288,45334,45381,45427,45473,45519, + 45565,45611,45657,45703,45749,45795,45840,45886,45932,45977,46023,46069,46114,46160, + 46205,46250,46296,46341,46386,46431,46477,46522,46567,46612,46657,46702,46746,46791, + 46836,46881,46926,46970,47015,47059,47104,47149,47193,47237,47282,47326,47370,47415, + 47459,47503,47547,47591,47635,47679,47723,47767,47811,47855,47899,47942,47986,48030, + 48074,48117,48161,48204,48248,48291,48335,48378,48421,48465,48508,48551,48594,48637, + 48680,48723,48766,48809,48852,48895,48938,48981,49024,49067,49109,49152,49195,49237, + 49280,49322,49365,49407,49450,49492,49535,49577,49619,49661,49704,49746,49788,49830, + 49872,49914,49956,49998,50040,50082,50124,50166,50207,50249,50291,50332,50374,50416, + 50457,50499,50540,50582,50623,50665,50706,50747,50789,50830,50871,50912,50954,50995, + 51036,51077,51118,51159,51200,51241,51282,51323,51364,51404,51445,51486,51527,51567, + 51608,51649,51689,51730,51770,51811,51851,51892,51932,51972,52013,52053,52093,52134, + 52174,52214,52254,52294,52334,52374,52414,52454,52494,52534,52574,52614,52654,52694, + 52734,52773,52813,52853,52892,52932,52972,53011,53051,53090,53130,53169,53209,53248, + 53287,53327,53366,53405,53445,53484,53523,53562,53601,53640,53679,53719,53758,53797, + 53836,53874,53913,53952,53991,54030,54069,54108,54146,54185,54224,54262,54301,54340, + 54378,54417,54455,54494,54532,54571,54609,54647,54686,54724,54762,54801,54839,54877, + 54915,54954,54992,55030,55068,55106,55144,55182,55220,55258,55296,55334,55372,55410, + 55447,55485,55523,55561,55599,55636,55674,55712,55749,55787,55824,55862,55900,55937, + 55975,56012,56049,56087,56124,56162,56199,56236,56273,56311,56348,56385,56422,56459, + 56497,56534,56571,56608,56645,56682,56719,56756,56793,56830,56867,56903,56940,56977, + 57014,57051,57087,57124,57161,57198,57234,57271,57307,57344,57381,57417,57454,57490, + 57527,57563,57599,57636,57672,57709,57745,57781,57817,57854,57890,57926,57962,57999, + 58035,58071,58107,58143,58179,58215,58251,58287,58323,58359,58395,58431,58467,58503, + 58538,58574,58610,58646,58682,58717,58753,58789,58824,58860,58896,58931,58967,59002, + 59038,59073,59109,59144,59180,59215,59251,59286,59321,59357,59392,59427,59463,59498, + 59533,59568,59603,59639,59674,59709,59744,59779,59814,59849,59884,59919,59954,59989, + 60024,60059,60094,60129,60164,60199,60233,60268,60303,60338,60373,60407,60442,60477, + 60511,60546,60581,60615,60650,60684,60719,60753,60788,60822,60857,60891,60926,60960, + 60995,61029,61063,61098,61132,61166,61201,61235,61269,61303,61338,61372,61406,61440, + 61474,61508,61542,61576,61610,61644,61678,61712,61746,61780,61814,61848,61882,61916, + 61950,61984,62018,62051,62085,62119,62153,62186,62220,62254,62287,62321,62355,62388, + 62422,62456,62489,62523,62556,62590,62623,62657,62690,62724,62757,62790,62824,62857, + 62891,62924,62957,62991,63024,63057,63090,63124,63157,63190,63223,63256,63289,63323, + 63356,63389,63422,63455,63488,63521,63554,63587,63620,63653,63686,63719,63752,63785, + 63817,63850,63883,63916,63949,63982,64014,64047,64080,64113,64145,64178,64211,64243, + 64276,64309,64341,64374,64406,64439,64471,64504,64536,64569,64601,64634,64666,64699, + 64731,64763,64796,64828,64861,64893,64925,64957,64990,65022,65054,65086,65119,65151, + 65183,65215,65247,65279,65312,65344,65376,65408,65440,65472,65504 +}; - int8 g_elder_bit_table[256] = //---------g_elder_bit_table - { - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - +int8 g_elder_bit_table[256] = //---------g_elder_bit_table +{ + 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 +}; + } diff --git a/deps/agg/src/agg_trans_affine.cpp b/deps/agg/src/agg_trans_affine.cpp index 84a1f9c1e..cf2203260 100644 --- a/deps/agg/src/agg_trans_affine.cpp +++ b/deps/agg/src/agg_trans_affine.cpp @@ -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. // @@ -22,173 +22,173 @@ namespace agg { - const trans_affine trans_affine::identity; +const trans_affine trans_affine::identity; - //------------------------------------------------------------------------ - const trans_affine& trans_affine::parl_to_parl(const double* src, - const double* dst) - { - sx = src[2] - src[0]; - shy = src[3] - src[1]; - shx = src[4] - src[0]; - sy = src[5] - src[1]; - tx = src[0]; - ty = src[1]; - invert(); - multiply(trans_affine(dst[2] - dst[0], dst[3] - dst[1], - dst[4] - dst[0], dst[5] - dst[1], - dst[0], dst[1])); - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::parl_to_parl(const double* src, + const double* dst) +{ + sx = src[2] - src[0]; + shy = src[3] - src[1]; + shx = src[4] - src[0]; + sy = src[5] - src[1]; + tx = src[0]; + ty = src[1]; + invert(); + multiply(trans_affine(dst[2] - dst[0], dst[3] - dst[1], + dst[4] - dst[0], dst[5] - dst[1], + dst[0], dst[1])); + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::rect_to_parl(double x1, double y1, - double x2, double y2, - const double* parl) - { - double src[6]; - src[0] = x1; src[1] = y1; - src[2] = x2; src[3] = y1; - src[4] = x2; src[5] = y2; - parl_to_parl(src, parl); - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::rect_to_parl(double x1, double y1, + double x2, double y2, + const double* parl) +{ + double src[6]; + src[0] = x1; src[1] = y1; + src[2] = x2; src[3] = y1; + src[4] = x2; src[5] = y2; + parl_to_parl(src, parl); + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::parl_to_rect(const double* parl, - double x1, double y1, - double x2, double y2) - { - double dst[6]; - dst[0] = x1; dst[1] = y1; - dst[2] = x2; dst[3] = y1; - dst[4] = x2; dst[5] = y2; - parl_to_parl(parl, dst); - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::parl_to_rect(const double* parl, + double x1, double y1, + double x2, double y2) +{ + double dst[6]; + dst[0] = x1; dst[1] = y1; + dst[2] = x2; dst[3] = y1; + dst[4] = x2; dst[5] = y2; + parl_to_parl(parl, dst); + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::multiply(const trans_affine& m) - { - double t0 = sx * m.sx + shy * m.shx; - double t2 = shx * m.sx + sy * m.shx; - double t4 = tx * m.sx + ty * m.shx + m.tx; - shy = sx * m.shy + shy * m.sy; - sy = shx * m.shy + sy * m.sy; - ty = tx * m.shy + ty * m.sy + m.ty; - sx = t0; - shx = t2; - tx = t4; - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::multiply(const trans_affine& m) +{ + double t0 = sx * m.sx + shy * m.shx; + double t2 = shx * m.sx + sy * m.shx; + double t4 = tx * m.sx + ty * m.shx + m.tx; + shy = sx * m.shy + shy * m.sy; + sy = shx * m.shy + sy * m.sy; + ty = tx * m.shy + ty * m.sy + m.ty; + sx = t0; + shx = t2; + tx = t4; + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::invert() - { - double d = determinant_reciprocal(); +//------------------------------------------------------------------------ +const trans_affine& trans_affine::invert() +{ + double d = determinant_reciprocal(); - double t0 = sy * d; - sy = sx * d; - shy = -shy * d; - shx = -shx * d; + double t0 = sy * d; + sy = sx * d; + shy = -shy * d; + shx = -shx * d; - double t4 = -tx * t0 - ty * shx; - ty = -tx * shy - ty * sy; + double t4 = -tx * t0 - ty * shx; + ty = -tx * shy - ty * sy; - sx = t0; - tx = t4; - return *this; - } + sx = t0; + tx = t4; + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::flip_x() - { - sx = -sx; - shy = -shy; - tx = -tx; - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::flip_x() +{ + sx = -sx; + shy = -shy; + tx = -tx; + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::flip_y() - { - shx = -shx; - sy = -sy; - ty = -ty; - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::flip_y() +{ + shx = -shx; + sy = -sy; + ty = -ty; + return *this; +} - //------------------------------------------------------------------------ - const trans_affine& trans_affine::reset() - { - sx = sy = 1.0; - shy = shx = tx = ty = 0.0; - return *this; - } +//------------------------------------------------------------------------ +const trans_affine& trans_affine::reset() +{ + sx = sy = 1.0; + shy = shx = tx = ty = 0.0; + return *this; +} - //------------------------------------------------------------------------ - bool trans_affine::is_identity(double epsilon) const - { - return is_equal_eps(sx, 1.0, epsilon) && - is_equal_eps(shy, 0.0, epsilon) && - is_equal_eps(shx, 0.0, epsilon) && - is_equal_eps(sy, 1.0, epsilon) && - is_equal_eps(tx, 0.0, epsilon) && - is_equal_eps(ty, 0.0, epsilon); - } +//------------------------------------------------------------------------ +bool trans_affine::is_identity(double epsilon) const +{ + return is_equal_eps(sx, 1.0, epsilon) && + is_equal_eps(shy, 0.0, epsilon) && + is_equal_eps(shx, 0.0, epsilon) && + is_equal_eps(sy, 1.0, epsilon) && + is_equal_eps(tx, 0.0, epsilon) && + is_equal_eps(ty, 0.0, epsilon); +} - //------------------------------------------------------------------------ - bool trans_affine::is_valid(double epsilon) const - { - return fabs(sx) > epsilon && fabs(sy) > epsilon; - } +//------------------------------------------------------------------------ +bool trans_affine::is_valid(double epsilon) const +{ + return fabs(sx) > epsilon && fabs(sy) > epsilon; +} - //------------------------------------------------------------------------ - bool trans_affine::is_equal(const trans_affine& m, double epsilon) const - { - return is_equal_eps(sx, m.sx, epsilon) && - is_equal_eps(shy, m.shy, epsilon) && - is_equal_eps(shx, m.shx, epsilon) && - is_equal_eps(sy, m.sy, epsilon) && - is_equal_eps(tx, m.tx, epsilon) && - is_equal_eps(ty, m.ty, epsilon); - } +//------------------------------------------------------------------------ +bool trans_affine::is_equal(const trans_affine& m, double epsilon) const +{ + return is_equal_eps(sx, m.sx, epsilon) && + is_equal_eps(shy, m.shy, epsilon) && + is_equal_eps(shx, m.shx, epsilon) && + is_equal_eps(sy, m.sy, epsilon) && + is_equal_eps(tx, m.tx, epsilon) && + is_equal_eps(ty, m.ty, epsilon); +} - //------------------------------------------------------------------------ - double trans_affine::rotation() const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 0.0; - transform(&x1, &y1); - transform(&x2, &y2); - return atan2(y2-y1, x2-x1); - } +//------------------------------------------------------------------------ +double trans_affine::rotation() const +{ + double x1 = 0.0; + double y1 = 0.0; + double x2 = 1.0; + double y2 = 0.0; + transform(&x1, &y1); + transform(&x2, &y2); + return atan2(y2-y1, x2-x1); +} - //------------------------------------------------------------------------ - void trans_affine::translation(double* dx, double* dy) const - { - *dx = tx; - *dy = ty; - } +//------------------------------------------------------------------------ +void trans_affine::translation(double* dx, double* dy) const +{ + *dx = tx; + *dy = ty; +} - //------------------------------------------------------------------------ - void trans_affine::scaling(double* x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 1.0; - trans_affine t(*this); - t *= trans_affine_rotation(-rotation()); - t.transform(&x1, &y1); - t.transform(&x2, &y2); - *x = x2 - x1; - *y = y2 - y1; - } +//------------------------------------------------------------------------ +void trans_affine::scaling(double* x, double* y) const +{ + double x1 = 0.0; + double y1 = 0.0; + double x2 = 1.0; + double y2 = 1.0; + trans_affine t(*this); + t *= trans_affine_rotation(-rotation()); + t.transform(&x1, &y1); + t.transform(&x2, &y2); + *x = x2 - x1; + *y = y2 - y1; +} } diff --git a/deps/agg/src/agg_trans_double_path.cpp b/deps/agg/src/agg_trans_double_path.cpp index d5692a9d1..686e30a51 100644 --- a/deps/agg/src/agg_trans_double_path.cpp +++ b/deps/agg/src/agg_trans_double_path.cpp @@ -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. // @@ -19,176 +19,176 @@ namespace agg { - //------------------------------------------------------------------------ - trans_double_path::trans_double_path() : - m_base_length(0.0), - m_base_height(1.0), - m_kindex1(0.0), - m_kindex2(0.0), - m_status1(initial), - m_status2(initial), - m_preserve_x_scale(true) +//------------------------------------------------------------------------ +trans_double_path::trans_double_path() : + m_base_length(0.0), + m_base_height(1.0), + m_kindex1(0.0), + m_kindex2(0.0), + m_status1(initial), + m_status2(initial), + m_preserve_x_scale(true) +{ +} + + +//------------------------------------------------------------------------ +void trans_double_path::reset() +{ + m_src_vertices1.remove_all(); + m_src_vertices2.remove_all(); + m_kindex1 = 0.0; + m_kindex1 = 0.0; + m_status1 = initial; + m_status2 = initial; +} + + +//------------------------------------------------------------------------ +void trans_double_path::move_to1(double x, double y) +{ + if(m_status1 == initial) { + m_src_vertices1.modify_last(vertex_dist(x, y)); + m_status1 = making_path; } - - - //------------------------------------------------------------------------ - void trans_double_path::reset() + else { - m_src_vertices1.remove_all(); - m_src_vertices2.remove_all(); - m_kindex1 = 0.0; - m_kindex1 = 0.0; - m_status1 = initial; - m_status2 = initial; + line_to1(x, y); } +} - //------------------------------------------------------------------------ - void trans_double_path::move_to1(double x, double y) +//------------------------------------------------------------------------ +void trans_double_path::line_to1(double x, double y) +{ + if(m_status1 == making_path) { - if(m_status1 == initial) + m_src_vertices1.add(vertex_dist(x, y)); + } +} + + +//------------------------------------------------------------------------ +void trans_double_path::move_to2(double x, double y) +{ + if(m_status2 == initial) + { + m_src_vertices2.modify_last(vertex_dist(x, y)); + m_status2 = making_path; + } + else + { + line_to2(x, y); + } +} + + +//------------------------------------------------------------------------ +void trans_double_path::line_to2(double x, double y) +{ + if(m_status2 == making_path) + { + m_src_vertices2.add(vertex_dist(x, y)); + } +} + + +//------------------------------------------------------------------------ +double trans_double_path::finalize_path(vertex_storage& vertices) +{ + unsigned i; + double dist; + double d; + + vertices.close(false); + if(vertices.size() > 2) + { + if(vertices[vertices.size() - 2].dist * 10.0 < + vertices[vertices.size() - 3].dist) { - m_src_vertices1.modify_last(vertex_dist(x, y)); - m_status1 = making_path; - } - else - { - line_to1(x, y); + d = vertices[vertices.size() - 3].dist + + vertices[vertices.size() - 2].dist; + + vertices[vertices.size() - 2] = + vertices[vertices.size() - 1]; + + vertices.remove_last(); + vertices[vertices.size() - 2].dist = d; } } - - //------------------------------------------------------------------------ - void trans_double_path::line_to1(double x, double y) + dist = 0; + for(i = 0; i < vertices.size(); i++) { - if(m_status1 == making_path) - { - m_src_vertices1.add(vertex_dist(x, y)); - } + vertex_dist& v = vertices[i]; + d = v.dist; + v.dist = dist; + dist += d; } + return (vertices.size() - 1) / dist; +} - //------------------------------------------------------------------------ - void trans_double_path::move_to2(double x, double y) + +//------------------------------------------------------------------------ +void trans_double_path::finalize_paths() +{ + if(m_status1 == making_path && m_src_vertices1.size() > 1 && + m_status2 == making_path && m_src_vertices2.size() > 1) { - if(m_status2 == initial) - { - m_src_vertices2.modify_last(vertex_dist(x, y)); - m_status2 = making_path; - } - else - { - line_to2(x, y); - } + m_kindex1 = finalize_path(m_src_vertices1); + m_kindex2 = finalize_path(m_src_vertices2); + m_status1 = ready; + m_status2 = ready; } +} - //------------------------------------------------------------------------ - void trans_double_path::line_to2(double x, double y) +//------------------------------------------------------------------------ +double trans_double_path::total_length1() const +{ + if(m_base_length >= 1e-10) return m_base_length; + return (m_status1 == ready) ? + m_src_vertices1[m_src_vertices1.size() - 1].dist : + 0.0; +} + + +//------------------------------------------------------------------------ +double trans_double_path::total_length2() const +{ + if(m_base_length >= 1e-10) return m_base_length; + return (m_status2 == ready) ? + m_src_vertices2[m_src_vertices2.size() - 1].dist : + 0.0; +} + + +//------------------------------------------------------------------------ +void trans_double_path::transform1(const vertex_storage& vertices, + double kindex, double kx, + double *x, double* y) const +{ + double x1 = 0.0; + double y1 = 0.0; + double dx = 1.0; + double dy = 1.0; + double d = 0.0; + double dd = 1.0; + *x *= kx; + if(*x < 0.0) { - if(m_status2 == making_path) - { - m_src_vertices2.add(vertex_dist(x, y)); - } + // Extrapolation on the left + //-------------------------- + x1 = vertices[0].x; + y1 = vertices[0].y; + dx = vertices[1].x - x1; + dy = vertices[1].y - y1; + dd = vertices[1].dist - vertices[0].dist; + d = *x; } - - - //------------------------------------------------------------------------ - double trans_double_path::finalize_path(vertex_storage& vertices) - { - unsigned i; - double dist; - double d; - - vertices.close(false); - if(vertices.size() > 2) - { - if(vertices[vertices.size() - 2].dist * 10.0 < - vertices[vertices.size() - 3].dist) - { - d = vertices[vertices.size() - 3].dist + - vertices[vertices.size() - 2].dist; - - vertices[vertices.size() - 2] = - vertices[vertices.size() - 1]; - - vertices.remove_last(); - vertices[vertices.size() - 2].dist = d; - } - } - - dist = 0; - for(i = 0; i < vertices.size(); i++) - { - vertex_dist& v = vertices[i]; - d = v.dist; - v.dist = dist; - dist += d; - } - - return (vertices.size() - 1) / dist; - } - - - //------------------------------------------------------------------------ - void trans_double_path::finalize_paths() - { - if(m_status1 == making_path && m_src_vertices1.size() > 1 && - m_status2 == making_path && m_src_vertices2.size() > 1) - { - m_kindex1 = finalize_path(m_src_vertices1); - m_kindex2 = finalize_path(m_src_vertices2); - m_status1 = ready; - m_status2 = ready; - } - } - - - //------------------------------------------------------------------------ - double trans_double_path::total_length1() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status1 == ready) ? - m_src_vertices1[m_src_vertices1.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - double trans_double_path::total_length2() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status2 == ready) ? - m_src_vertices2[m_src_vertices2.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - void trans_double_path::transform1(const vertex_storage& vertices, - double kindex, double kx, - double *x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double dx = 1.0; - double dy = 1.0; - double d = 0.0; - double dd = 1.0; - *x *= kx; - if(*x < 0.0) - { - // Extrapolation on the left - //-------------------------- - x1 = vertices[0].x; - y1 = vertices[0].y; - dx = vertices[1].x - x1; - dy = vertices[1].y - y1; - dd = vertices[1].dist - vertices[0].dist; - d = *x; - } - else + else if(*x > vertices[vertices.size() - 1].dist) { // Extrapolation on the right @@ -211,13 +211,13 @@ namespace agg if(m_preserve_x_scale) { unsigned k; - for(i = 0; (j - i) > 1; ) + for(i = 0; (j - i) > 1; ) { - if(*x < vertices[k = (i + j) >> 1].dist) + if(*x < vertices[k = (i + j) >> 1].dist) { - j = k; + j = k; } - else + else { i = k; } @@ -238,36 +238,36 @@ namespace agg dx = vertices[j].x - x1; dy = vertices[j].y - y1; } - *x = x1 + dx * d / dd; - *y = y1 + dy * d / dd; - } + *x = x1 + dx * d / dd; + *y = y1 + dy * d / dd; +} - //------------------------------------------------------------------------ - void trans_double_path::transform(double *x, double *y) const +//------------------------------------------------------------------------ +void trans_double_path::transform(double *x, double *y) const +{ + if(m_status1 == ready && m_status2 == ready) { - if(m_status1 == ready && m_status2 == ready) + if(m_base_length > 1e-10) { - if(m_base_length > 1e-10) - { - *x *= m_src_vertices1[m_src_vertices1.size() - 1].dist / - m_base_length; - } - - double x1 = *x; - double y1 = *y; - double x2 = *x; - double y2 = *y; - double dd = m_src_vertices2[m_src_vertices2.size() - 1].dist / - m_src_vertices1[m_src_vertices1.size() - 1].dist; - - transform1(m_src_vertices1, m_kindex1, 1.0, &x1, &y1); - transform1(m_src_vertices2, m_kindex2, dd, &x2, &y2); - - *x = x1 + *y * (x2 - x1) / m_base_height; - *y = y1 + *y * (y2 - y1) / m_base_height; + *x *= m_src_vertices1[m_src_vertices1.size() - 1].dist / + m_base_length; } + + double x1 = *x; + double y1 = *y; + double x2 = *x; + double y2 = *y; + double dd = m_src_vertices2[m_src_vertices2.size() - 1].dist / + m_src_vertices1[m_src_vertices1.size() - 1].dist; + + transform1(m_src_vertices1, m_kindex1, 1.0, &x1, &y1); + transform1(m_src_vertices2, m_kindex2, dd, &x2, &y2); + + *x = x1 + *y * (x2 - x1) / m_base_height; + *y = y1 + *y * (y2 - y1) / m_base_height; } +} } diff --git a/deps/agg/src/agg_trans_single_path.cpp b/deps/agg/src/agg_trans_single_path.cpp index 2120fc9b9..57a6cb094 100644 --- a/deps/agg/src/agg_trans_single_path.cpp +++ b/deps/agg/src/agg_trans_single_path.cpp @@ -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. // @@ -20,127 +20,127 @@ namespace agg { - //------------------------------------------------------------------------ - trans_single_path::trans_single_path() : - m_base_length(0.0), - m_kindex(0.0), - m_status(initial), - m_preserve_x_scale(true) - { - } +//------------------------------------------------------------------------ +trans_single_path::trans_single_path() : + m_base_length(0.0), + m_kindex(0.0), + m_status(initial), + m_preserve_x_scale(true) +{ +} - //------------------------------------------------------------------------ - void trans_single_path::reset() - { - m_src_vertices.remove_all(); - m_kindex = 0.0; - m_status = initial; - } +//------------------------------------------------------------------------ +void trans_single_path::reset() +{ + m_src_vertices.remove_all(); + m_kindex = 0.0; + m_status = initial; +} - //------------------------------------------------------------------------ - void trans_single_path::move_to(double x, double y) +//------------------------------------------------------------------------ +void trans_single_path::move_to(double x, double y) +{ + if(m_status == initial) { - if(m_status == initial) + m_src_vertices.modify_last(vertex_dist(x, y)); + m_status = making_path; + } + else + { + line_to(x, y); + } +} + +//------------------------------------------------------------------------ +void trans_single_path::line_to(double x, double y) +{ + if(m_status == making_path) + { + m_src_vertices.add(vertex_dist(x, y)); + } +} + + +//------------------------------------------------------------------------ +void trans_single_path::finalize_path() +{ + if(m_status == making_path && m_src_vertices.size() > 1) + { + unsigned i; + double dist; + double d; + + m_src_vertices.close(false); + if(m_src_vertices.size() > 2) { - m_src_vertices.modify_last(vertex_dist(x, y)); - m_status = making_path; + if(m_src_vertices[m_src_vertices.size() - 2].dist * 10.0 < + m_src_vertices[m_src_vertices.size() - 3].dist) + { + d = m_src_vertices[m_src_vertices.size() - 3].dist + + m_src_vertices[m_src_vertices.size() - 2].dist; + + m_src_vertices[m_src_vertices.size() - 2] = + m_src_vertices[m_src_vertices.size() - 1]; + + m_src_vertices.remove_last(); + m_src_vertices[m_src_vertices.size() - 2].dist = d; + } + } + + dist = 0.0; + for(i = 0; i < m_src_vertices.size(); i++) + { + vertex_dist& v = m_src_vertices[i]; + double d = v.dist; + v.dist = dist; + dist += d; + } + m_kindex = (m_src_vertices.size() - 1) / dist; + m_status = ready; + } +} + + + +//------------------------------------------------------------------------ +double trans_single_path::total_length() const +{ + if(m_base_length >= 1e-10) return m_base_length; + return (m_status == ready) ? + m_src_vertices[m_src_vertices.size() - 1].dist : + 0.0; +} + + +//------------------------------------------------------------------------ +void trans_single_path::transform(double *x, double *y) const +{ + if(m_status == ready) + { + if(m_base_length > 1e-10) + { + *x *= m_src_vertices[m_src_vertices.size() - 1].dist / + m_base_length; + } + + double x1 = 0.0; + double y1 = 0.0; + double dx = 1.0; + double dy = 1.0; + double d = 0.0; + double dd = 1.0; + if(*x < 0.0) + { + // Extrapolation on the left + //-------------------------- + x1 = m_src_vertices[0].x; + y1 = m_src_vertices[0].y; + dx = m_src_vertices[1].x - x1; + dy = m_src_vertices[1].y - y1; + dd = m_src_vertices[1].dist - m_src_vertices[0].dist; + d = *x; } else - { - line_to(x, y); - } - } - - //------------------------------------------------------------------------ - void trans_single_path::line_to(double x, double y) - { - if(m_status == making_path) - { - m_src_vertices.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - void trans_single_path::finalize_path() - { - if(m_status == making_path && m_src_vertices.size() > 1) - { - unsigned i; - double dist; - double d; - - m_src_vertices.close(false); - if(m_src_vertices.size() > 2) - { - if(m_src_vertices[m_src_vertices.size() - 2].dist * 10.0 < - m_src_vertices[m_src_vertices.size() - 3].dist) - { - d = m_src_vertices[m_src_vertices.size() - 3].dist + - m_src_vertices[m_src_vertices.size() - 2].dist; - - m_src_vertices[m_src_vertices.size() - 2] = - m_src_vertices[m_src_vertices.size() - 1]; - - m_src_vertices.remove_last(); - m_src_vertices[m_src_vertices.size() - 2].dist = d; - } - } - - dist = 0.0; - for(i = 0; i < m_src_vertices.size(); i++) - { - vertex_dist& v = m_src_vertices[i]; - double d = v.dist; - v.dist = dist; - dist += d; - } - m_kindex = (m_src_vertices.size() - 1) / dist; - m_status = ready; - } - } - - - - //------------------------------------------------------------------------ - double trans_single_path::total_length() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status == ready) ? - m_src_vertices[m_src_vertices.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - void trans_single_path::transform(double *x, double *y) const - { - if(m_status == ready) - { - if(m_base_length > 1e-10) - { - *x *= m_src_vertices[m_src_vertices.size() - 1].dist / - m_base_length; - } - - double x1 = 0.0; - double y1 = 0.0; - double dx = 1.0; - double dy = 1.0; - double d = 0.0; - double dd = 1.0; - if(*x < 0.0) - { - // Extrapolation on the left - //-------------------------- - x1 = m_src_vertices[0].x; - y1 = m_src_vertices[0].y; - dx = m_src_vertices[1].x - x1; - dy = m_src_vertices[1].y - y1; - dd = m_src_vertices[1].dist - m_src_vertices[0].dist; - d = *x; - } - else if(*x > m_src_vertices[m_src_vertices.size() - 1].dist) { // Extrapolation on the right @@ -163,13 +163,13 @@ namespace agg if(m_preserve_x_scale) { unsigned k; - for(i = 0; (j - i) > 1; ) + for(i = 0; (j - i) > 1; ) { - if(*x < m_src_vertices[k = (i + j) >> 1].dist) + if(*x < m_src_vertices[k = (i + j) >> 1].dist) { - j = k; + j = k; } - else + else { i = k; } @@ -190,12 +190,12 @@ namespace agg dx = m_src_vertices[j].x - x1; dy = m_src_vertices[j].y - y1; } - double x2 = x1 + dx * d / dd; - double y2 = y1 + dy * d / dd; - *x = x2 - *y * dy / dd; - *y = y2 + *y * dx / dd; - } + double x2 = x1 + dx * d / dd; + double y2 = y1 + dy * d / dd; + *x = x2 - *y * dy / dd; + *y = y2 + *y * dx / dd; } +} } diff --git a/deps/agg/src/agg_trans_warp_magnifier.cpp b/deps/agg/src/agg_trans_warp_magnifier.cpp index e65afabba..eef5254eb 100644 --- a/deps/agg/src/agg_trans_warp_magnifier.cpp +++ b/deps/agg/src/agg_trans_warp_magnifier.cpp @@ -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. // @@ -19,52 +19,52 @@ namespace agg { - //------------------------------------------------------------------------ - void trans_warp_magnifier::transform(double* x, double* y) const +//------------------------------------------------------------------------ +void trans_warp_magnifier::transform(double* x, double* y) const +{ + double dx = *x - m_xc; + double dy = *y - m_yc; + double r = sqrt(dx * dx + dy * dy); + if(r < m_radius) { - double dx = *x - m_xc; - double dy = *y - m_yc; - double r = sqrt(dx * dx + dy * dy); - if(r < m_radius) - { - *x = m_xc + dx * m_magn; - *y = m_yc + dy * m_magn; - return; - } - - double m = (r + m_radius * (m_magn - 1.0)) / r; - *x = m_xc + dx * m; - *y = m_yc + dy * m; + *x = m_xc + dx * m_magn; + *y = m_yc + dy * m_magn; + return; } - //------------------------------------------------------------------------ - void trans_warp_magnifier::inverse_transform(double* x, double* y) const + double m = (r + m_radius * (m_magn - 1.0)) / r; + *x = m_xc + dx * m; + *y = m_yc + dy * m; +} + +//------------------------------------------------------------------------ +void trans_warp_magnifier::inverse_transform(double* x, double* y) const +{ + // New version by Andrew Skalkin + //----------------- + double dx = *x - m_xc; + double dy = *y - m_yc; + double r = sqrt(dx * dx + dy * dy); + + if(r < m_radius * m_magn) { - // New version by Andrew Skalkin - //----------------- - double dx = *x - m_xc; - double dy = *y - m_yc; - double r = sqrt(dx * dx + dy * dy); - - if(r < m_radius * m_magn) - { - *x = m_xc + dx / m_magn; - *y = m_yc + dy / m_magn; - } - else - { - double rnew = r - m_radius * (m_magn - 1.0); - *x = m_xc + rnew * dx / r; - *y = m_yc + rnew * dy / r; - } - - // Old version - //----------------- - //trans_warp_magnifier t(*this); - //t.magnification(1.0 / m_magn); - //t.radius(m_radius * m_magn); - //t.transform(x, y); + *x = m_xc + dx / m_magn; + *y = m_yc + dy / m_magn; } + else + { + double rnew = r - m_radius * (m_magn - 1.0); + *x = m_xc + rnew * dx / r; + *y = m_yc + rnew * dy / r; + } + + // Old version + //----------------- + //trans_warp_magnifier t(*this); + //t.magnification(1.0 / m_magn); + //t.radius(m_radius * m_magn); + //t.transform(x, y); +} } diff --git a/deps/agg/src/agg_vcgen_bspline.cpp b/deps/agg/src/agg_vcgen_bspline.cpp index 4a0be6693..5bb377f5e 100644 --- a/deps/agg/src/agg_vcgen_bspline.cpp +++ b/deps/agg/src/agg_vcgen_bspline.cpp @@ -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,176 +18,176 @@ namespace agg { - //------------------------------------------------------------------------ - vcgen_bspline::vcgen_bspline() : - m_src_vertices(), - m_spline_x(), - m_spline_y(), - m_interpolation_step(1.0/50.0), - m_closed(0), - m_status(initial), - m_src_vertex(0) +//------------------------------------------------------------------------ +vcgen_bspline::vcgen_bspline() : + m_src_vertices(), + m_spline_x(), + m_spline_y(), + m_interpolation_step(1.0/50.0), + m_closed(0), + m_status(initial), + m_src_vertex(0) +{ +} + + +//------------------------------------------------------------------------ +void vcgen_bspline::remove_all() +{ + m_src_vertices.remove_all(); + m_closed = 0; + m_status = initial; + m_src_vertex = 0; +} + + +//------------------------------------------------------------------------ +void vcgen_bspline::add_vertex(double x, double y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { + m_src_vertices.modify_last(point_d(x, y)); } - - - //------------------------------------------------------------------------ - void vcgen_bspline::remove_all() + else { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) + if(is_vertex(cmd)) { - m_src_vertices.modify_last(point_d(x, y)); + m_src_vertices.add(point_d(x, y)); } else { - if(is_vertex(cmd)) - { - m_src_vertices.add(point_d(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } + m_closed = get_close_flag(cmd); } } +} - //------------------------------------------------------------------------ - void vcgen_bspline::rewind(unsigned) +//------------------------------------------------------------------------ +void vcgen_bspline::rewind(unsigned) +{ + m_cur_abscissa = 0.0; + m_max_abscissa = 0.0; + m_src_vertex = 0; + if(m_status == initial && m_src_vertices.size() > 2) { + if(m_closed) + { + m_spline_x.init(m_src_vertices.size() + 8); + m_spline_y.init(m_src_vertices.size() + 8); + m_spline_x.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).x); + m_spline_y.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).y); + m_spline_x.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].x); + m_spline_y.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].y); + m_spline_x.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].x); + m_spline_y.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].y); + m_spline_x.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].x); + m_spline_y.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].y); + } + else + { + m_spline_x.init(m_src_vertices.size()); + m_spline_y.init(m_src_vertices.size()); + } + unsigned i; + for(i = 0; i < m_src_vertices.size(); i++) + { + double x = m_closed ? i + 4 : i; + m_spline_x.add_point(x, m_src_vertices[i].x); + m_spline_y.add_point(x, m_src_vertices[i].y); + } m_cur_abscissa = 0.0; - m_max_abscissa = 0.0; - m_src_vertex = 0; - if(m_status == initial && m_src_vertices.size() > 2) + m_max_abscissa = m_src_vertices.size() - 1; + if(m_closed) { - if(m_closed) - { - m_spline_x.init(m_src_vertices.size() + 8); - m_spline_y.init(m_src_vertices.size() + 8); - m_spline_x.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).x); - m_spline_y.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).y); - m_spline_x.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].x); - m_spline_y.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].y); - m_spline_x.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].x); - m_spline_y.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].y); - m_spline_x.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].x); - m_spline_y.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].y); - } - else - { - m_spline_x.init(m_src_vertices.size()); - m_spline_y.init(m_src_vertices.size()); - } - unsigned i; - for(i = 0; i < m_src_vertices.size(); i++) - { - double x = m_closed ? i + 4 : i; - m_spline_x.add_point(x, m_src_vertices[i].x); - m_spline_y.add_point(x, m_src_vertices[i].y); - } - m_cur_abscissa = 0.0; - m_max_abscissa = m_src_vertices.size() - 1; - if(m_closed) - { - m_cur_abscissa = 4.0; - m_max_abscissa += 5.0; - m_spline_x.add_point(m_src_vertices.size() + 4, m_src_vertices[0].x); - m_spline_y.add_point(m_src_vertices.size() + 4, m_src_vertices[0].y); - m_spline_x.add_point(m_src_vertices.size() + 5, m_src_vertices[1].x); - m_spline_y.add_point(m_src_vertices.size() + 5, m_src_vertices[1].y); - m_spline_x.add_point(m_src_vertices.size() + 6, m_src_vertices[2].x); - m_spline_y.add_point(m_src_vertices.size() + 6, m_src_vertices[2].y); - m_spline_x.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).x); - m_spline_y.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).y); - } - m_spline_x.prepare(); - m_spline_y.prepare(); + m_cur_abscissa = 4.0; + m_max_abscissa += 5.0; + m_spline_x.add_point(m_src_vertices.size() + 4, m_src_vertices[0].x); + m_spline_y.add_point(m_src_vertices.size() + 4, m_src_vertices[0].y); + m_spline_x.add_point(m_src_vertices.size() + 5, m_src_vertices[1].x); + m_spline_y.add_point(m_src_vertices.size() + 5, m_src_vertices[1].y); + m_spline_x.add_point(m_src_vertices.size() + 6, m_src_vertices[2].x); + m_spline_y.add_point(m_src_vertices.size() + 6, m_src_vertices[2].y); + m_spline_x.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).x); + m_spline_y.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).y); } - m_status = ready; + m_spline_x.prepare(); + m_spline_y.prepare(); } + m_status = ready; +} - //------------------------------------------------------------------------ - unsigned vcgen_bspline::vertex(double* x, double* y) +//------------------------------------------------------------------------ +unsigned vcgen_bspline::vertex(double* x, double* y) +{ + unsigned cmd = path_cmd_line_to; + while(!is_stop(cmd)) { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) + switch(m_status) { - switch(m_status) + case initial: + rewind(0); + + case ready: + if(m_src_vertices.size() < 2) { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - - if(m_src_vertices.size() == 2) - { - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - if(m_src_vertex == 1) return path_cmd_move_to; - if(m_src_vertex == 2) return path_cmd_line_to; - cmd = path_cmd_stop; - break; - } - - cmd = path_cmd_move_to; - m_status = polygon; - m_src_vertex = 0; - - case polygon: - if(m_cur_abscissa >= m_max_abscissa) - { - if(m_closed) - { - m_status = end_poly; - break; - } - else - { - *x = m_src_vertices[m_src_vertices.size() - 1].x; - *y = m_src_vertices[m_src_vertices.size() - 1].y; - m_status = end_poly; - return path_cmd_line_to; - } - } - - *x = m_spline_x.get_stateful(m_cur_abscissa); - *y = m_spline_y.get_stateful(m_cur_abscissa); - m_src_vertex++; - m_cur_abscissa += m_interpolation_step; - return (m_src_vertex == 1) ? path_cmd_move_to : path_cmd_line_to; - - case end_poly: - m_status = stop; - return path_cmd_end_poly | m_closed; - - case stop: - return path_cmd_stop; + cmd = path_cmd_stop; + break; } + + if(m_src_vertices.size() == 2) + { + *x = m_src_vertices[m_src_vertex].x; + *y = m_src_vertices[m_src_vertex].y; + m_src_vertex++; + if(m_src_vertex == 1) return path_cmd_move_to; + if(m_src_vertex == 2) return path_cmd_line_to; + cmd = path_cmd_stop; + break; + } + + cmd = path_cmd_move_to; + m_status = polygon; + m_src_vertex = 0; + + case polygon: + if(m_cur_abscissa >= m_max_abscissa) + { + if(m_closed) + { + m_status = end_poly; + break; + } + else + { + *x = m_src_vertices[m_src_vertices.size() - 1].x; + *y = m_src_vertices[m_src_vertices.size() - 1].y; + m_status = end_poly; + return path_cmd_line_to; + } + } + + *x = m_spline_x.get_stateful(m_cur_abscissa); + *y = m_spline_y.get_stateful(m_cur_abscissa); + m_src_vertex++; + m_cur_abscissa += m_interpolation_step; + return (m_src_vertex == 1) ? path_cmd_move_to : path_cmd_line_to; + + case end_poly: + m_status = stop; + return path_cmd_end_poly | m_closed; + + case stop: + return path_cmd_stop; } - return cmd; } + return cmd; +} } diff --git a/deps/agg/src/agg_vcgen_contour.cpp b/deps/agg/src/agg_vcgen_contour.cpp index a6a99405a..cb3829e6e 100644 --- a/deps/agg/src/agg_vcgen_contour.cpp +++ b/deps/agg/src/agg_vcgen_contour.cpp @@ -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. // @@ -23,143 +23,143 @@ namespace agg { - //------------------------------------------------------------------------ - vcgen_contour::vcgen_contour() : - m_stroker(), - m_width(1), - m_src_vertices(), - m_out_vertices(), - m_status(initial), - m_src_vertex(0), - m_closed(0), - m_orientation(0), - m_auto_detect(false) - { - } +//------------------------------------------------------------------------ +vcgen_contour::vcgen_contour() : + m_stroker(), + m_width(1), + m_src_vertices(), + m_out_vertices(), + m_status(initial), + m_src_vertex(0), + m_closed(0), + m_orientation(0), + m_auto_detect(false) +{ +} - //------------------------------------------------------------------------ - void vcgen_contour::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_orientation = 0; - m_status = initial; - } +//------------------------------------------------------------------------ +void vcgen_contour::remove_all() +{ + m_src_vertices.remove_all(); + m_closed = 0; + m_orientation = 0; + m_status = initial; +} - //------------------------------------------------------------------------ - void vcgen_contour::add_vertex(double x, double y, unsigned cmd) +//------------------------------------------------------------------------ +void vcgen_contour::add_vertex(double x, double y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { - m_status = initial; - if(is_move_to(cmd)) + m_src_vertices.modify_last(vertex_dist(x, y)); + } + else + { + if(is_vertex(cmd)) { - m_src_vertices.modify_last(vertex_dist(x, y)); + m_src_vertices.add(vertex_dist(x, y)); } else { - if(is_vertex(cmd)) + if(is_end_poly(cmd)) { - m_src_vertices.add(vertex_dist(x, y)); + m_closed = get_close_flag(cmd); + if(m_orientation == path_flags_none) + { + m_orientation = get_orientation(cmd); + } + } + } + } +} + +//------------------------------------------------------------------------ +void vcgen_contour::rewind(unsigned) +{ + if(m_status == initial) + { + m_src_vertices.close(true); + if(m_auto_detect) + { + if(!is_oriented(m_orientation)) + { + m_orientation = (calc_polygon_area(m_src_vertices) > 0.0) ? + path_flags_ccw : + path_flags_cw; + } + } + if(is_oriented(m_orientation)) + { + m_stroker.width(is_ccw(m_orientation) ? m_width : -m_width); + } + } + m_status = ready; + m_src_vertex = 0; +} + +//------------------------------------------------------------------------ +unsigned vcgen_contour::vertex(double* x, double* y) +{ + unsigned cmd = path_cmd_line_to; + while(!is_stop(cmd)) + { + switch(m_status) + { + case initial: + rewind(0); + + case ready: + if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) + { + cmd = path_cmd_stop; + break; + } + m_status = outline; + cmd = path_cmd_move_to; + m_src_vertex = 0; + m_out_vertex = 0; + + case outline: + if(m_src_vertex >= m_src_vertices.size()) + { + m_status = end_poly; + break; + } + m_stroker.calc_join(m_out_vertices, + m_src_vertices.prev(m_src_vertex), + m_src_vertices.curr(m_src_vertex), + m_src_vertices.next(m_src_vertex), + m_src_vertices.prev(m_src_vertex).dist, + m_src_vertices.curr(m_src_vertex).dist); + ++m_src_vertex; + m_status = out_vertices; + m_out_vertex = 0; + + case out_vertices: + if(m_out_vertex >= m_out_vertices.size()) + { + m_status = outline; } else { - if(is_end_poly(cmd)) - { - m_closed = get_close_flag(cmd); - if(m_orientation == path_flags_none) - { - m_orientation = get_orientation(cmd); - } - } + const point_d& c = m_out_vertices[m_out_vertex++]; + *x = c.x; + *y = c.y; + return cmd; } + break; + + case end_poly: + if(!m_closed) return path_cmd_stop; + m_status = stop; + return path_cmd_end_poly | path_flags_close | path_flags_ccw; + + case stop: + return path_cmd_stop; } } - - //------------------------------------------------------------------------ - void vcgen_contour::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(true); - if(m_auto_detect) - { - if(!is_oriented(m_orientation)) - { - m_orientation = (calc_polygon_area(m_src_vertices) > 0.0) ? - path_flags_ccw : - path_flags_cw; - } - } - if(is_oriented(m_orientation)) - { - m_stroker.width(is_ccw(m_orientation) ? m_width : -m_width); - } - } - m_status = ready; - m_src_vertex = 0; - } - - //------------------------------------------------------------------------ - unsigned vcgen_contour::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) - { - cmd = path_cmd_stop; - break; - } - m_status = outline; - cmd = path_cmd_move_to; - m_src_vertex = 0; - m_out_vertex = 0; - - case outline: - if(m_src_vertex >= m_src_vertices.size()) - { - m_status = end_poly; - break; - } - m_stroker.calc_join(m_out_vertices, - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.prev(m_src_vertex).dist, - m_src_vertices.curr(m_src_vertex).dist); - ++m_src_vertex; - m_status = out_vertices; - m_out_vertex = 0; - - case out_vertices: - if(m_out_vertex >= m_out_vertices.size()) - { - m_status = outline; - } - else - { - const point_d& c = m_out_vertices[m_out_vertex++]; - *x = c.x; - *y = c.y; - return cmd; - } - break; - - case end_poly: - if(!m_closed) return path_cmd_stop; - m_status = stop; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } + return cmd; +} } diff --git a/deps/agg/src/agg_vcgen_dash.cpp b/deps/agg/src/agg_vcgen_dash.cpp index 129505786..2799dc132 100644 --- a/deps/agg/src/agg_vcgen_dash.cpp +++ b/deps/agg/src/agg_vcgen_dash.cpp @@ -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. // @@ -24,211 +24,211 @@ namespace agg { - //------------------------------------------------------------------------ - vcgen_dash::vcgen_dash() : - m_total_dash_len(0.0), - m_num_dashes(0), - m_dash_start(0.0), - m_shorten(0.0), - m_curr_dash_start(0.0), - m_curr_dash(0), - m_src_vertices(), - m_closed(0), - m_status(initial), - m_src_vertex(0) +//------------------------------------------------------------------------ +vcgen_dash::vcgen_dash() : + m_total_dash_len(0.0), + m_num_dashes(0), + m_dash_start(0.0), + m_shorten(0.0), + m_curr_dash_start(0.0), + m_curr_dash(0), + m_src_vertices(), + m_closed(0), + m_status(initial), + m_src_vertex(0) +{ +} + + + +//------------------------------------------------------------------------ +void vcgen_dash::remove_all_dashes() +{ + m_total_dash_len = 0.0; + m_num_dashes = 0; + m_curr_dash_start = 0.0; + m_curr_dash = 0; +} + + +//------------------------------------------------------------------------ +void vcgen_dash::add_dash(double dash_len, double gap_len) +{ + if(m_num_dashes < max_dashes) { + m_total_dash_len += dash_len + gap_len; + m_dashes[m_num_dashes++] = dash_len; + m_dashes[m_num_dashes++] = gap_len; } +} +//------------------------------------------------------------------------ +void vcgen_dash::dash_start(double ds) +{ + m_dash_start = ds; + calc_dash_start(fabs(ds)); +} - //------------------------------------------------------------------------ - void vcgen_dash::remove_all_dashes() + +//------------------------------------------------------------------------ +void vcgen_dash::calc_dash_start(double ds) +{ + m_curr_dash = 0; + m_curr_dash_start = 0.0; + while(ds > 0.0) { - m_total_dash_len = 0.0; - m_num_dashes = 0; - m_curr_dash_start = 0.0; - m_curr_dash = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_dash::add_dash(double dash_len, double gap_len) - { - if(m_num_dashes < max_dashes) + if(ds > m_dashes[m_curr_dash]) { - m_total_dash_len += dash_len + gap_len; - m_dashes[m_num_dashes++] = dash_len; - m_dashes[m_num_dashes++] = gap_len; - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::dash_start(double ds) - { - m_dash_start = ds; - calc_dash_start(fabs(ds)); - } - - - //------------------------------------------------------------------------ - void vcgen_dash::calc_dash_start(double ds) - { - m_curr_dash = 0; - m_curr_dash_start = 0.0; - while(ds > 0.0) - { - if(ds > m_dashes[m_curr_dash]) - { - ds -= m_dashes[m_curr_dash]; - ++m_curr_dash; - m_curr_dash_start = 0.0; - if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; - } - else - { - m_curr_dash_start = ds; - ds = 0.0; - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::remove_all() - { - m_status = initial; - m_src_vertices.remove_all(); - m_closed = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_dash::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); + ds -= m_dashes[m_curr_dash]; + ++m_curr_dash; + m_curr_dash_start = 0.0; + if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; } else { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } + m_curr_dash_start = ds; + ds = 0.0; } } +} - //------------------------------------------------------------------------ - void vcgen_dash::rewind(unsigned) +//------------------------------------------------------------------------ +void vcgen_dash::remove_all() +{ + m_status = initial; + m_src_vertices.remove_all(); + m_closed = 0; +} + + +//------------------------------------------------------------------------ +void vcgen_dash::add_vertex(double x, double y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - shorten_path(m_src_vertices, m_shorten, m_closed); - } - m_status = ready; - m_src_vertex = 0; + m_src_vertices.modify_last(vertex_dist(x, y)); } - - - //------------------------------------------------------------------------ - unsigned vcgen_dash::vertex(double* x, double* y) + else { - unsigned cmd = path_cmd_move_to; - while(!is_stop(cmd)) + if(is_vertex(cmd)) { - switch(m_status) + m_src_vertices.add(vertex_dist(x, y)); + } + else + { + m_closed = get_close_flag(cmd); + } + } +} + + +//------------------------------------------------------------------------ +void vcgen_dash::rewind(unsigned) +{ + if(m_status == initial) + { + m_src_vertices.close(m_closed != 0); + shorten_path(m_src_vertices, m_shorten, m_closed); + } + m_status = ready; + m_src_vertex = 0; +} + + +//------------------------------------------------------------------------ +unsigned vcgen_dash::vertex(double* x, double* y) +{ + unsigned cmd = path_cmd_move_to; + while(!is_stop(cmd)) + { + switch(m_status) + { + case initial: + rewind(0); + + case ready: + if(m_num_dashes < 2 || m_src_vertices.size() < 2) { - case initial: - rewind(0); - - case ready: - if(m_num_dashes < 2 || m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - m_status = polyline; - m_src_vertex = 1; - m_v1 = &m_src_vertices[0]; - m_v2 = &m_src_vertices[1]; - m_curr_rest = m_v1->dist; - *x = m_v1->x; - *y = m_v1->y; - if(m_dash_start >= 0.0) calc_dash_start(m_dash_start); - return path_cmd_move_to; - - case polyline: - { - double dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start; - - unsigned cmd = (m_curr_dash & 1) ? - path_cmd_move_to : - path_cmd_line_to; - - if(m_curr_rest > dash_rest) - { - m_curr_rest -= dash_rest; - ++m_curr_dash; - if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; - m_curr_dash_start = 0.0; - *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist; - *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist; - } - else - { - m_curr_dash_start += m_curr_rest; - *x = m_v2->x; - *y = m_v2->y; - ++m_src_vertex; - m_v1 = m_v2; - m_curr_rest = m_v1->dist; - if(m_closed) - { - if(m_src_vertex > m_src_vertices.size()) - { - m_status = stop; - } - else - { - m_v2 = &m_src_vertices - [ - (m_src_vertex >= m_src_vertices.size()) ? 0 : - m_src_vertex - ]; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size()) - { - m_status = stop; - } - else - { - m_v2 = &m_src_vertices[m_src_vertex]; - } - } - } - return cmd; - } - break; - - case stop: cmd = path_cmd_stop; break; } + m_status = polyline; + m_src_vertex = 1; + m_v1 = &m_src_vertices[0]; + m_v2 = &m_src_vertices[1]; + m_curr_rest = m_v1->dist; + *x = m_v1->x; + *y = m_v1->y; + if(m_dash_start >= 0.0) calc_dash_start(m_dash_start); + return path_cmd_move_to; + case polyline: + { + double dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start; + + unsigned cmd = (m_curr_dash & 1) ? + path_cmd_move_to : + path_cmd_line_to; + + if(m_curr_rest > dash_rest) + { + m_curr_rest -= dash_rest; + ++m_curr_dash; + if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; + m_curr_dash_start = 0.0; + *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist; + *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist; + } + else + { + m_curr_dash_start += m_curr_rest; + *x = m_v2->x; + *y = m_v2->y; + ++m_src_vertex; + m_v1 = m_v2; + m_curr_rest = m_v1->dist; + if(m_closed) + { + if(m_src_vertex > m_src_vertices.size()) + { + m_status = stop; + } + else + { + m_v2 = &m_src_vertices + [ + (m_src_vertex >= m_src_vertices.size()) ? 0 : + m_src_vertex + ]; + } + } + else + { + if(m_src_vertex >= m_src_vertices.size()) + { + m_status = stop; + } + else + { + m_v2 = &m_src_vertices[m_src_vertex]; + } + } + } + return cmd; } - return path_cmd_stop; + break; + + case stop: + cmd = path_cmd_stop; + break; + } + } + return path_cmd_stop; +} } diff --git a/deps/agg/src/agg_vcgen_markers_term.cpp b/deps/agg/src/agg_vcgen_markers_term.cpp index 3374ab5e8..89cd93ee8 100644 --- a/deps/agg/src/agg_vcgen_markers_term.cpp +++ b/deps/agg/src/agg_vcgen_markers_term.cpp @@ -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. // @@ -22,82 +22,82 @@ namespace agg { - //------------------------------------------------------------------------ - void vcgen_markers_term::remove_all() +//------------------------------------------------------------------------ +void vcgen_markers_term::remove_all() +{ + m_markers.remove_all(); +} + + +//------------------------------------------------------------------------ +void vcgen_markers_term::add_vertex(double x, double y, unsigned cmd) +{ + if(is_move_to(cmd)) { - m_markers.remove_all(); + if(m_markers.size() & 1) + { + // Initial state, the first coordinate was added. + // If two of more calls of start_vertex() occures + // we just modify the last one. + m_markers.modify_last(coord_type(x, y)); + } + else + { + m_markers.add(coord_type(x, y)); + } } - - - //------------------------------------------------------------------------ - void vcgen_markers_term::add_vertex(double x, double y, unsigned cmd) + else { - if(is_move_to(cmd)) + if(is_vertex(cmd)) { if(m_markers.size() & 1) { // Initial state, the first coordinate was added. - // If two of more calls of start_vertex() occures - // we just modify the last one. - m_markers.modify_last(coord_type(x, y)); + // Add three more points, 0,1,1,0 + m_markers.add(coord_type(x, y)); + m_markers.add(m_markers[m_markers.size() - 1]); + m_markers.add(m_markers[m_markers.size() - 3]); } else { - m_markers.add(coord_type(x, y)); - } - } - else - { - if(is_vertex(cmd)) - { - if(m_markers.size() & 1) + if(m_markers.size()) { - // Initial state, the first coordinate was added. - // Add three more points, 0,1,1,0 - m_markers.add(coord_type(x, y)); - m_markers.add(m_markers[m_markers.size() - 1]); - m_markers.add(m_markers[m_markers.size() - 3]); - } - else - { - if(m_markers.size()) - { - // Replace two last points: 0,1,1,0 -> 0,1,2,1 - m_markers[m_markers.size() - 1] = m_markers[m_markers.size() - 2]; - m_markers[m_markers.size() - 2] = coord_type(x, y); - } + // Replace two last points: 0,1,1,0 -> 0,1,2,1 + m_markers[m_markers.size() - 1] = m_markers[m_markers.size() - 2]; + m_markers[m_markers.size() - 2] = coord_type(x, y); } } } } +} - //------------------------------------------------------------------------ - void vcgen_markers_term::rewind(unsigned path_id) +//------------------------------------------------------------------------ +void vcgen_markers_term::rewind(unsigned path_id) +{ + m_curr_id = path_id * 2; + m_curr_idx = m_curr_id; +} + + +//------------------------------------------------------------------------ +unsigned vcgen_markers_term::vertex(double* x, double* y) +{ + if(m_curr_id > 2 || m_curr_idx >= m_markers.size()) { - m_curr_id = path_id * 2; - m_curr_idx = m_curr_id; + return path_cmd_stop; } - - - //------------------------------------------------------------------------ - unsigned vcgen_markers_term::vertex(double* x, double* y) + const coord_type& c = m_markers[m_curr_idx]; + *x = c.x; + *y = c.y; + if(m_curr_idx & 1) { - if(m_curr_id > 2 || m_curr_idx >= m_markers.size()) - { - return path_cmd_stop; - } - const coord_type& c = m_markers[m_curr_idx]; - *x = c.x; - *y = c.y; - if(m_curr_idx & 1) - { - m_curr_idx += 3; - return path_cmd_line_to; - } - ++m_curr_idx; - return path_cmd_move_to; + m_curr_idx += 3; + return path_cmd_line_to; } + ++m_curr_idx; + return path_cmd_move_to; +} } diff --git a/deps/agg/src/agg_vcgen_smooth_poly1.cpp b/deps/agg/src/agg_vcgen_smooth_poly1.cpp index ff7d488d3..eec9ca576 100644 --- a/deps/agg/src/agg_vcgen_smooth_poly1.cpp +++ b/deps/agg/src/agg_vcgen_smooth_poly1.cpp @@ -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. // @@ -22,204 +22,204 @@ namespace agg { - //------------------------------------------------------------------------ - vcgen_smooth_poly1::vcgen_smooth_poly1() : - m_src_vertices(), - m_smooth_value(0.5), - m_closed(0), - m_status(initial), - m_src_vertex(0) +//------------------------------------------------------------------------ +vcgen_smooth_poly1::vcgen_smooth_poly1() : + m_src_vertices(), + m_smooth_value(0.5), + m_closed(0), + m_status(initial), + m_src_vertex(0) +{ +} + + +//------------------------------------------------------------------------ +void vcgen_smooth_poly1::remove_all() +{ + m_src_vertices.remove_all(); + m_closed = 0; + m_status = initial; +} + + +//------------------------------------------------------------------------ +void vcgen_smooth_poly1::add_vertex(double x, double y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { + m_src_vertices.modify_last(vertex_dist(x, y)); } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::remove_all() + else { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) + if(is_vertex(cmd)) { - m_src_vertices.modify_last(vertex_dist(x, y)); + m_src_vertices.add(vertex_dist(x, y)); } else { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } + m_closed = get_close_flag(cmd); } } +} - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::rewind(unsigned) +//------------------------------------------------------------------------ +void vcgen_smooth_poly1::rewind(unsigned) +{ + if(m_status == initial) { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - } - m_status = ready; - m_src_vertex = 0; + m_src_vertices.close(m_closed != 0); } + m_status = ready; + m_src_vertex = 0; +} - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::calculate(const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - const vertex_dist& v3) +//------------------------------------------------------------------------ +void vcgen_smooth_poly1::calculate(const vertex_dist& v0, + const vertex_dist& v1, + const vertex_dist& v2, + const vertex_dist& v3) +{ + + double k1 = v0.dist / (v0.dist + v1.dist); + double k2 = v1.dist / (v1.dist + v2.dist); + + double xm1 = v0.x + (v2.x - v0.x) * k1; + double ym1 = v0.y + (v2.y - v0.y) * k1; + double xm2 = v1.x + (v3.x - v1.x) * k2; + double ym2 = v1.y + (v3.y - v1.y) * k2; + + m_ctrl1_x = v1.x + m_smooth_value * (v2.x - xm1); + m_ctrl1_y = v1.y + m_smooth_value * (v2.y - ym1); + m_ctrl2_x = v2.x + m_smooth_value * (v1.x - xm2); + m_ctrl2_y = v2.y + m_smooth_value * (v1.y - ym2); +} + + +//------------------------------------------------------------------------ +unsigned vcgen_smooth_poly1::vertex(double* x, double* y) +{ + unsigned cmd = path_cmd_line_to; + while(!is_stop(cmd)) { - - double k1 = v0.dist / (v0.dist + v1.dist); - double k2 = v1.dist / (v1.dist + v2.dist); - - double xm1 = v0.x + (v2.x - v0.x) * k1; - double ym1 = v0.y + (v2.y - v0.y) * k1; - double xm2 = v1.x + (v3.x - v1.x) * k2; - double ym2 = v1.y + (v3.y - v1.y) * k2; - - m_ctrl1_x = v1.x + m_smooth_value * (v2.x - xm1); - m_ctrl1_y = v1.y + m_smooth_value * (v2.y - ym1); - m_ctrl2_x = v2.x + m_smooth_value * (v1.x - xm2); - m_ctrl2_y = v2.y + m_smooth_value * (v1.y - ym2); - } - - - //------------------------------------------------------------------------ - unsigned vcgen_smooth_poly1::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) + switch(m_status) { - switch(m_status) + case initial: + rewind(0); + + case ready: + if(m_src_vertices.size() < 2) { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - - if(m_src_vertices.size() == 2) - { - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - if(m_src_vertex == 1) return path_cmd_move_to; - if(m_src_vertex == 2) return path_cmd_line_to; - cmd = path_cmd_stop; - break; - } - - cmd = path_cmd_move_to; - m_status = polygon; - m_src_vertex = 0; - - case polygon: - if(m_closed) - { - if(m_src_vertex >= m_src_vertices.size()) - { - *x = m_src_vertices[0].x; - *y = m_src_vertices[0].y; - m_status = end_poly; - return path_cmd_curve4; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size() - 1) - { - *x = m_src_vertices[m_src_vertices.size() - 1].x; - *y = m_src_vertices[m_src_vertices.size() - 1].y; - m_status = end_poly; - return path_cmd_curve3; - } - } - - calculate(m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.next(m_src_vertex + 1)); + cmd = path_cmd_stop; + break; + } + if(m_src_vertices.size() == 2) + { *x = m_src_vertices[m_src_vertex].x; *y = m_src_vertices[m_src_vertex].y; m_src_vertex++; + if(m_src_vertex == 1) return path_cmd_move_to; + if(m_src_vertex == 2) return path_cmd_line_to; + cmd = path_cmd_stop; + break; + } - if(m_closed) + cmd = path_cmd_move_to; + m_status = polygon; + m_src_vertex = 0; + + case polygon: + if(m_closed) + { + if(m_src_vertex >= m_src_vertices.size()) { - m_status = ctrl1; - return ((m_src_vertex == 1) ? - path_cmd_move_to : - path_cmd_curve4); - } - else - { - if(m_src_vertex == 1) - { - m_status = ctrl_b; - return path_cmd_move_to; - } - if(m_src_vertex >= m_src_vertices.size() - 1) - { - m_status = ctrl_e; - return path_cmd_curve3; - } - m_status = ctrl1; + *x = m_src_vertices[0].x; + *y = m_src_vertices[0].y; + m_status = end_poly; return path_cmd_curve4; } - break; - - case ctrl_b: - *x = m_ctrl2_x; - *y = m_ctrl2_y; - m_status = polygon; - return path_cmd_curve3; - - case ctrl_e: - *x = m_ctrl1_x; - *y = m_ctrl1_y; - m_status = polygon; - return path_cmd_curve3; - - case ctrl1: - *x = m_ctrl1_x; - *y = m_ctrl1_y; - m_status = ctrl2; - return path_cmd_curve4; - - case ctrl2: - *x = m_ctrl2_x; - *y = m_ctrl2_y; - m_status = polygon; - return path_cmd_curve4; - - case end_poly: - m_status = stop; - return path_cmd_end_poly | m_closed; - - case stop: - return path_cmd_stop; } + else + { + if(m_src_vertex >= m_src_vertices.size() - 1) + { + *x = m_src_vertices[m_src_vertices.size() - 1].x; + *y = m_src_vertices[m_src_vertices.size() - 1].y; + m_status = end_poly; + return path_cmd_curve3; + } + } + + calculate(m_src_vertices.prev(m_src_vertex), + m_src_vertices.curr(m_src_vertex), + m_src_vertices.next(m_src_vertex), + m_src_vertices.next(m_src_vertex + 1)); + + *x = m_src_vertices[m_src_vertex].x; + *y = m_src_vertices[m_src_vertex].y; + m_src_vertex++; + + if(m_closed) + { + m_status = ctrl1; + return ((m_src_vertex == 1) ? + path_cmd_move_to : + path_cmd_curve4); + } + else + { + if(m_src_vertex == 1) + { + m_status = ctrl_b; + return path_cmd_move_to; + } + if(m_src_vertex >= m_src_vertices.size() - 1) + { + m_status = ctrl_e; + return path_cmd_curve3; + } + m_status = ctrl1; + return path_cmd_curve4; + } + break; + + case ctrl_b: + *x = m_ctrl2_x; + *y = m_ctrl2_y; + m_status = polygon; + return path_cmd_curve3; + + case ctrl_e: + *x = m_ctrl1_x; + *y = m_ctrl1_y; + m_status = polygon; + return path_cmd_curve3; + + case ctrl1: + *x = m_ctrl1_x; + *y = m_ctrl1_y; + m_status = ctrl2; + return path_cmd_curve4; + + case ctrl2: + *x = m_ctrl2_x; + *y = m_ctrl2_y; + m_status = polygon; + return path_cmd_curve4; + + case end_poly: + m_status = stop; + return path_cmd_end_poly | m_closed; + + case stop: + return path_cmd_stop; } - return cmd; } + return cmd; +} } diff --git a/deps/agg/src/agg_vcgen_stroke.cpp b/deps/agg/src/agg_vcgen_stroke.cpp index 2dae3e122..3ee336f03 100644 --- a/deps/agg/src/agg_vcgen_stroke.cpp +++ b/deps/agg/src/agg_vcgen_stroke.cpp @@ -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. // @@ -23,191 +23,191 @@ namespace agg { - //------------------------------------------------------------------------ - vcgen_stroke::vcgen_stroke() : - m_stroker(), - m_src_vertices(), - m_out_vertices(), - m_shorten(0.0), - m_closed(0), - m_status(initial), - m_src_vertex(0), - m_out_vertex(0) +//------------------------------------------------------------------------ +vcgen_stroke::vcgen_stroke() : + m_stroker(), + m_src_vertices(), + m_out_vertices(), + m_shorten(0.0), + m_closed(0), + m_status(initial), + m_src_vertex(0), + m_out_vertex(0) +{ +} + +//------------------------------------------------------------------------ +void vcgen_stroke::remove_all() +{ + m_src_vertices.remove_all(); + m_closed = 0; + m_status = initial; +} + + +//------------------------------------------------------------------------ +void vcgen_stroke::add_vertex(double x, double y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { + m_src_vertices.modify_last(vertex_dist(x, y)); } - - //------------------------------------------------------------------------ - void vcgen_stroke::remove_all() + else { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - } - - - //------------------------------------------------------------------------ - void vcgen_stroke::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) + if(is_vertex(cmd)) { - m_src_vertices.modify_last(vertex_dist(x, y)); + m_src_vertices.add(vertex_dist(x, y)); } else { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } + m_closed = get_close_flag(cmd); } } +} - //------------------------------------------------------------------------ - void vcgen_stroke::rewind(unsigned) +//------------------------------------------------------------------------ +void vcgen_stroke::rewind(unsigned) +{ + if(m_status == initial) { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - shorten_path(m_src_vertices, m_shorten, m_closed); - if(m_src_vertices.size() < 3) m_closed = 0; - } - m_status = ready; - m_src_vertex = 0; - m_out_vertex = 0; + m_src_vertices.close(m_closed != 0); + shorten_path(m_src_vertices, m_shorten, m_closed); + if(m_src_vertices.size() < 3) m_closed = 0; } + m_status = ready; + m_src_vertex = 0; + m_out_vertex = 0; +} - //------------------------------------------------------------------------ - unsigned vcgen_stroke::vertex(double* x, double* y) +//------------------------------------------------------------------------ +unsigned vcgen_stroke::vertex(double* x, double* y) +{ + unsigned cmd = path_cmd_line_to; + while(!is_stop(cmd)) { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) + switch(m_status) { - switch(m_status) + case initial: + rewind(0); + + case ready: + if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) - { - cmd = path_cmd_stop; - break; - } - m_status = m_closed ? outline1 : cap1; - cmd = path_cmd_move_to; - m_src_vertex = 0; - m_out_vertex = 0; - break; - - case cap1: - m_stroker.calc_cap(m_out_vertices, - m_src_vertices[0], - m_src_vertices[1], - m_src_vertices[0].dist); - m_src_vertex = 1; - m_prev_status = outline1; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case cap2: - m_stroker.calc_cap(m_out_vertices, - m_src_vertices[m_src_vertices.size() - 1], - m_src_vertices[m_src_vertices.size() - 2], - m_src_vertices[m_src_vertices.size() - 2].dist); - m_prev_status = outline2; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case outline1: - if(m_closed) - { - if(m_src_vertex >= m_src_vertices.size()) - { - m_prev_status = close_first; - m_status = end_poly1; - break; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size() - 1) - { - m_status = cap2; - break; - } - } - m_stroker.calc_join(m_out_vertices, - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.prev(m_src_vertex).dist, - m_src_vertices.curr(m_src_vertex).dist); - ++m_src_vertex; - m_prev_status = m_status; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case close_first: - m_status = outline2; - cmd = path_cmd_move_to; - - case outline2: - if(m_src_vertex <= unsigned(m_closed == 0)) - { - m_status = end_poly2; - m_prev_status = stop; - break; - } - - --m_src_vertex; - m_stroker.calc_join(m_out_vertices, - m_src_vertices.next(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex).dist, - m_src_vertices.prev(m_src_vertex).dist); - - m_prev_status = m_status; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case out_vertices: - if(m_out_vertex >= m_out_vertices.size()) - { - m_status = m_prev_status; - } - else - { - const point_d& c = m_out_vertices[m_out_vertex++]; - *x = c.x; - *y = c.y; - return cmd; - } - break; - - case end_poly1: - m_status = m_prev_status; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - - case end_poly2: - m_status = m_prev_status; - return path_cmd_end_poly | path_flags_close | path_flags_cw; - - case stop: cmd = path_cmd_stop; break; } + m_status = m_closed ? outline1 : cap1; + cmd = path_cmd_move_to; + m_src_vertex = 0; + m_out_vertex = 0; + break; + + case cap1: + m_stroker.calc_cap(m_out_vertices, + m_src_vertices[0], + m_src_vertices[1], + m_src_vertices[0].dist); + m_src_vertex = 1; + m_prev_status = outline1; + m_status = out_vertices; + m_out_vertex = 0; + break; + + case cap2: + m_stroker.calc_cap(m_out_vertices, + m_src_vertices[m_src_vertices.size() - 1], + m_src_vertices[m_src_vertices.size() - 2], + m_src_vertices[m_src_vertices.size() - 2].dist); + m_prev_status = outline2; + m_status = out_vertices; + m_out_vertex = 0; + break; + + case outline1: + if(m_closed) + { + if(m_src_vertex >= m_src_vertices.size()) + { + m_prev_status = close_first; + m_status = end_poly1; + break; + } + } + else + { + if(m_src_vertex >= m_src_vertices.size() - 1) + { + m_status = cap2; + break; + } + } + m_stroker.calc_join(m_out_vertices, + m_src_vertices.prev(m_src_vertex), + m_src_vertices.curr(m_src_vertex), + m_src_vertices.next(m_src_vertex), + m_src_vertices.prev(m_src_vertex).dist, + m_src_vertices.curr(m_src_vertex).dist); + ++m_src_vertex; + m_prev_status = m_status; + m_status = out_vertices; + m_out_vertex = 0; + break; + + case close_first: + m_status = outline2; + cmd = path_cmd_move_to; + + case outline2: + if(m_src_vertex <= unsigned(m_closed == 0)) + { + m_status = end_poly2; + m_prev_status = stop; + break; + } + + --m_src_vertex; + m_stroker.calc_join(m_out_vertices, + m_src_vertices.next(m_src_vertex), + m_src_vertices.curr(m_src_vertex), + m_src_vertices.prev(m_src_vertex), + m_src_vertices.curr(m_src_vertex).dist, + m_src_vertices.prev(m_src_vertex).dist); + + m_prev_status = m_status; + m_status = out_vertices; + m_out_vertex = 0; + break; + + case out_vertices: + if(m_out_vertex >= m_out_vertices.size()) + { + m_status = m_prev_status; + } + else + { + const point_d& c = m_out_vertices[m_out_vertex++]; + *x = c.x; + *y = c.y; + return cmd; + } + break; + + case end_poly1: + m_status = m_prev_status; + return path_cmd_end_poly | path_flags_close | path_flags_ccw; + + case end_poly2: + m_status = m_prev_status; + return path_cmd_end_poly | path_flags_close | path_flags_cw; + + case stop: + cmd = path_cmd_stop; + break; } - return cmd; } + return cmd; +} } diff --git a/deps/agg/src/agg_vpgen_clip_polygon.cpp b/deps/agg/src/agg_vpgen_clip_polygon.cpp index 452452601..12e293507 100644 --- a/deps/agg/src/agg_vpgen_clip_polygon.cpp +++ b/deps/agg/src/agg_vpgen_clip_polygon.cpp @@ -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. // @@ -19,115 +19,115 @@ namespace agg { - //------------------------------------------------------------------------ - // Determine the clipping code of the vertex according to the - // Cyrus-Beck line clipping algorithm - // - // | | - // 0110 | 0010 | 0011 - // | | - // -------+--------+-------- clip_box.y2 - // | | - // 0100 | 0000 | 0001 - // | | - // -------+--------+-------- clip_box.y1 - // | | - // 1100 | 1000 | 1001 - // | | - // clip_box.x1 clip_box.x2 - // - // - unsigned vpgen_clip_polygon::clipping_flags(double x, double y) +//------------------------------------------------------------------------ +// Determine the clipping code of the vertex according to the +// Cyrus-Beck line clipping algorithm +// +// | | +// 0110 | 0010 | 0011 +// | | +// -------+--------+-------- clip_box.y2 +// | | +// 0100 | 0000 | 0001 +// | | +// -------+--------+-------- clip_box.y1 +// | | +// 1100 | 1000 | 1001 +// | | +// clip_box.x1 clip_box.x2 +// +// +unsigned vpgen_clip_polygon::clipping_flags(double x, double y) +{ + if(x < m_clip_box.x1) { - if(x < m_clip_box.x1) - { - if(y > m_clip_box.y2) return 6; - if(y < m_clip_box.y1) return 12; - return 4; - } - - if(x > m_clip_box.x2) - { - if(y > m_clip_box.y2) return 3; - if(y < m_clip_box.y1) return 9; - return 1; - } - - if(y > m_clip_box.y2) return 2; - if(y < m_clip_box.y1) return 8; - - return 0; + if(y > m_clip_box.y2) return 6; + if(y < m_clip_box.y1) return 12; + return 4; } - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::reset() + if(x > m_clip_box.x2) { - m_vertex = 0; - m_num_vertices = 0; + if(y > m_clip_box.y2) return 3; + if(y < m_clip_box.y1) return 9; + return 1; } - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::move_to(double x, double y) + if(y > m_clip_box.y2) return 2; + if(y < m_clip_box.y1) return 8; + + return 0; +} + +//---------------------------------------------------------------------------- +void vpgen_clip_polygon::reset() +{ + m_vertex = 0; + m_num_vertices = 0; +} + +//---------------------------------------------------------------------------- +void vpgen_clip_polygon::move_to(double x, double y) +{ + m_vertex = 0; + m_num_vertices = 0; + m_clip_flags = clipping_flags(x, y); + if(m_clip_flags == 0) { - m_vertex = 0; - m_num_vertices = 0; - m_clip_flags = clipping_flags(x, y); - if(m_clip_flags == 0) + m_x[0] = x; + m_y[0] = y; + m_num_vertices = 1; + } + m_x1 = x; + m_y1 = y; + m_cmd = path_cmd_move_to; +} + + +//---------------------------------------------------------------------------- +void vpgen_clip_polygon::line_to(double x, double y) +{ + m_vertex = 0; + m_num_vertices = 0; + unsigned flags = clipping_flags(x, y); + + if(m_clip_flags == flags) + { + if(flags == 0) { m_x[0] = x; m_y[0] = y; m_num_vertices = 1; } - m_x1 = x; - m_y1 = y; - m_cmd = path_cmd_move_to; } - - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::line_to(double x, double y) + else { - m_vertex = 0; - m_num_vertices = 0; - unsigned flags = clipping_flags(x, y); - - if(m_clip_flags == flags) - { - if(flags == 0) - { - m_x[0] = x; - m_y[0] = y; - m_num_vertices = 1; - } - } - else - { - m_num_vertices = clip_liang_barsky(m_x1, m_y1, - x, y, - m_clip_box, - m_x, m_y); - } - - m_clip_flags = flags; - m_x1 = x; - m_y1 = y; + m_num_vertices = clip_liang_barsky(m_x1, m_y1, + x, y, + m_clip_box, + m_x, m_y); } + m_clip_flags = flags; + m_x1 = x; + m_y1 = y; +} - //---------------------------------------------------------------------------- - unsigned vpgen_clip_polygon::vertex(double* x, double* y) + +//---------------------------------------------------------------------------- +unsigned vpgen_clip_polygon::vertex(double* x, double* y) +{ + if(m_vertex < m_num_vertices) { - if(m_vertex < m_num_vertices) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - ++m_vertex; - unsigned cmd = m_cmd; - m_cmd = path_cmd_line_to; - return cmd; - } - return path_cmd_stop; + *x = m_x[m_vertex]; + *y = m_y[m_vertex]; + ++m_vertex; + unsigned cmd = m_cmd; + m_cmd = path_cmd_line_to; + return cmd; } + return path_cmd_stop; +} } diff --git a/deps/agg/src/agg_vpgen_clip_polyline.cpp b/deps/agg/src/agg_vpgen_clip_polyline.cpp index 6840803a9..8b5d65121 100644 --- a/deps/agg/src/agg_vpgen_clip_polyline.cpp +++ b/deps/agg/src/agg_vpgen_clip_polyline.cpp @@ -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,60 +18,60 @@ namespace agg { - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::reset() - { - m_vertex = 0; - m_num_vertices = 0; - m_move_to = false; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::move_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - m_x1 = x; - m_y1 = y; - m_move_to = true; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::line_to(double x, double y) - { - double x2 = x; - double y2 = y; - unsigned flags = clip_line_segment(&m_x1, &m_y1, &x2, &y2, m_clip_box); - - m_vertex = 0; - m_num_vertices = 0; - if((flags & 4) == 0) - { - if((flags & 1) != 0 || m_move_to) - { - m_x[0] = m_x1; - m_y[0] = m_y1; - m_cmd[0] = path_cmd_move_to; - m_num_vertices = 1; - } - m_x[m_num_vertices] = x2; - m_y[m_num_vertices] = y2; - m_cmd[m_num_vertices++] = path_cmd_line_to; - m_move_to = (flags & 2) != 0; - } - m_x1 = x; - m_y1 = y; - } - - //---------------------------------------------------------------------------- - unsigned vpgen_clip_polyline::vertex(double* x, double* y) - { - if(m_vertex < m_num_vertices) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - return m_cmd[m_vertex++]; - } - return path_cmd_stop; - } +//---------------------------------------------------------------------------- +void vpgen_clip_polyline::reset() +{ + m_vertex = 0; + m_num_vertices = 0; + m_move_to = false; +} + +//---------------------------------------------------------------------------- +void vpgen_clip_polyline::move_to(double x, double y) +{ + m_vertex = 0; + m_num_vertices = 0; + m_x1 = x; + m_y1 = y; + m_move_to = true; +} + +//---------------------------------------------------------------------------- +void vpgen_clip_polyline::line_to(double x, double y) +{ + double x2 = x; + double y2 = y; + unsigned flags = clip_line_segment(&m_x1, &m_y1, &x2, &y2, m_clip_box); + + m_vertex = 0; + m_num_vertices = 0; + if((flags & 4) == 0) + { + if((flags & 1) != 0 || m_move_to) + { + m_x[0] = m_x1; + m_y[0] = m_y1; + m_cmd[0] = path_cmd_move_to; + m_num_vertices = 1; + } + m_x[m_num_vertices] = x2; + m_y[m_num_vertices] = y2; + m_cmd[m_num_vertices++] = path_cmd_line_to; + m_move_to = (flags & 2) != 0; + } + m_x1 = x; + m_y1 = y; +} + +//---------------------------------------------------------------------------- +unsigned vpgen_clip_polyline::vertex(double* x, double* y) +{ + if(m_vertex < m_num_vertices) + { + *x = m_x[m_vertex]; + *y = m_y[m_vertex]; + return m_cmd[m_vertex++]; + } + return path_cmd_stop; +} } diff --git a/deps/agg/src/agg_vpgen_segmentator.cpp b/deps/agg/src/agg_vpgen_segmentator.cpp index 49a45b6b1..7d5ccfcdd 100644 --- a/deps/agg/src/agg_vpgen_segmentator.cpp +++ b/deps/agg/src/agg_vpgen_segmentator.cpp @@ -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. // @@ -19,49 +19,49 @@ namespace agg { - void vpgen_segmentator::move_to(double x, double y) - { - m_x1 = x; - m_y1 = y; - m_dx = 0.0; - m_dy = 0.0; - m_dl = 2.0; - m_ddl = 2.0; - m_cmd = path_cmd_move_to; - } +void vpgen_segmentator::move_to(double x, double y) +{ + m_x1 = x; + m_y1 = y; + m_dx = 0.0; + m_dy = 0.0; + m_dl = 2.0; + m_ddl = 2.0; + m_cmd = path_cmd_move_to; +} - void vpgen_segmentator::line_to(double x, double y) - { - m_x1 += m_dx; - m_y1 += m_dy; - m_dx = x - m_x1; - m_dy = y - m_y1; - double len = sqrt(m_dx * m_dx + m_dy * m_dy) * m_approximation_scale; - if(len < 1e-30) len = 1e-30; - m_ddl = 1.0 / len; - m_dl = (m_cmd == path_cmd_move_to) ? 0.0 : m_ddl; - if(m_cmd == path_cmd_stop) m_cmd = path_cmd_line_to; - } +void vpgen_segmentator::line_to(double x, double y) +{ + m_x1 += m_dx; + m_y1 += m_dy; + m_dx = x - m_x1; + m_dy = y - m_y1; + double len = sqrt(m_dx * m_dx + m_dy * m_dy) * m_approximation_scale; + if(len < 1e-30) len = 1e-30; + m_ddl = 1.0 / len; + m_dl = (m_cmd == path_cmd_move_to) ? 0.0 : m_ddl; + if(m_cmd == path_cmd_stop) m_cmd = path_cmd_line_to; +} - unsigned vpgen_segmentator::vertex(double* x, double* y) - { - if(m_cmd == path_cmd_stop) return path_cmd_stop; +unsigned vpgen_segmentator::vertex(double* x, double* y) +{ + if(m_cmd == path_cmd_stop) return path_cmd_stop; - unsigned cmd = m_cmd; - m_cmd = path_cmd_line_to; - if(m_dl >= 1.0 - m_ddl) - { - m_dl = 1.0; - m_cmd = path_cmd_stop; - *x = m_x1 + m_dx; - *y = m_y1 + m_dy; - return cmd; - } - *x = m_x1 + m_dx * m_dl; - *y = m_y1 + m_dy * m_dl; - m_dl += m_ddl; + unsigned cmd = m_cmd; + m_cmd = path_cmd_line_to; + if(m_dl >= 1.0 - m_ddl) + { + m_dl = 1.0; + m_cmd = path_cmd_stop; + *x = m_x1 + m_dx; + *y = m_y1 + m_dy; return cmd; } + *x = m_x1 + m_dx * m_dl; + *y = m_y1 + m_dy * m_dl; + m_dl += m_ddl; + return cmd; +} } diff --git a/deps/clipper/include/clipper.hpp b/deps/clipper/include/clipper.hpp old mode 100644 new mode 100755 index f35a75dd4..4683ef38d --- a/deps/clipper/include/clipper.hpp +++ b/deps/clipper/include/clipper.hpp @@ -1,338 +1,345 @@ -/******************************************************************************* -* * -* Author : Angus Johnson * -* Version : 5.1.0 * -* Date : 1 February 2013 * -* Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2013 * -* * -* License: * -* Use, modification & distribution is subject to Boost Software License Ver 1. * -* http://www.boost.org/LICENSE_1_0.txt * -* * -* Attributions: * -* The code in this library is an extension of Bala Vatti's clipping algorithm: * -* "A generic solution to polygon clipping" * -* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * -* http://portal.acm.org/citation.cfm?id=129906 * -* * -* Computer graphics and geometric modeling: implementation and algorithms * -* By Max K. Agoston * -* Springer; 1 edition (January 4, 2005) * -* http://books.google.com/books?q=vatti+clipping+agoston * -* * -* See also: * -* "Polygon Offsetting by Computing Winding Numbers" * -* Paper no. DETC2005-85513 pp. 565-575 * -* ASME 2005 International Design Engineering Technical Conferences * -* and Computers and Information in Engineering Conference (IDETC/CIE2005) * -* September 24-28, 2005 , Long Beach, California, USA * -* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * -* * -*******************************************************************************/ - -#ifndef clipper_hpp -#define clipper_hpp - -#include -#include -#include -#include -#include - -namespace ClipperLib { - -enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; -enum PolyType { ptSubject, ptClip }; -//By far the most widely used winding rules for polygon filling are -//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) -//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) -//see http://glprogramming.com/red/chapter11.html -enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; - -typedef signed long long long64; -typedef unsigned long long ulong64; - -struct IntPoint { -public: - long64 X; - long64 Y; - IntPoint(long64 x = 0, long64 y = 0): X(x), Y(y) {}; - friend std::ostream& operator <<(std::ostream &s, IntPoint &p); -}; - -typedef std::vector< IntPoint > Polygon; -typedef std::vector< Polygon > Polygons; - - -std::ostream& operator <<(std::ostream &s, Polygon &p); -std::ostream& operator <<(std::ostream &s, Polygons &p); - -class PolyNode; -typedef std::vector< PolyNode* > PolyNodes; - -class PolyNode -{ -public: - Polygon Contour; - PolyNodes Childs; - PolyNode* Parent; - PolyNode* GetNext(); - bool IsHole(); - int ChildCount(); -private: - PolyNode* GetNextSiblingUp(); - unsigned Index; //node index in Parent.Childs - void AddChild(PolyNode& child); - friend class Clipper; //to access Index -}; - -class PolyTree: public PolyNode -{ -public: - ~PolyTree(){Clear();}; - PolyNode* GetFirst(); - void Clear(); - int Total(); -private: - PolyNodes AllNodes; - friend class Clipper; //to access AllNodes -}; - -enum JoinType { jtSquare, jtRound, jtMiter }; - -bool Orientation(const Polygon &poly); -double Area(const Polygon &poly); -void OffsetPolygons(const Polygons &in_polys, Polygons &out_polys, - double delta, JoinType jointype = jtSquare, double MiterLimit = 2, bool AutoFix = true); - -void SimplifyPolygon(const Polygon &in_poly, Polygons &out_polys, PolyFillType fillType = pftEvenOdd); -void SimplifyPolygons(const Polygons &in_polys, Polygons &out_polys, PolyFillType fillType = pftEvenOdd); -void SimplifyPolygons(Polygons &polys, PolyFillType fillType = pftEvenOdd); - -void CleanPolygon(Polygon& in_poly, Polygon& out_poly, double distance = 1.415); -void CleanPolygons(Polygons& in_polys, Polygons& out_polys, double distance = 1.415); - -void PolyTreeToPolygons(PolyTree& polytree, Polygons& polygons); - -void ReversePolygon(Polygon& p); -void ReversePolygons(Polygons& p); - -//used internally ... -enum EdgeSide { esLeft = 1, esRight = 2}; -enum IntersectProtects { ipNone = 0, ipLeft = 1, ipRight = 2, ipBoth = 3 }; - -struct TEdge { - long64 xbot; - long64 ybot; - long64 xcurr; - long64 ycurr; - long64 xtop; - long64 ytop; - double dx; - long64 deltaX; - long64 deltaY; - long64 tmpX; - PolyType polyType; - EdgeSide side; - int windDelta; //1 or -1 depending on winding direction - int windCnt; - int windCnt2; //winding count of the opposite polytype - int outIdx; - TEdge *next; - TEdge *prev; - TEdge *nextInLML; - TEdge *nextInAEL; - TEdge *prevInAEL; - TEdge *nextInSEL; - TEdge *prevInSEL; -}; - -struct IntersectNode { - TEdge *edge1; - TEdge *edge2; - IntPoint pt; - IntersectNode *next; -}; - -struct LocalMinima { - long64 Y; - TEdge *leftBound; - TEdge *rightBound; - LocalMinima *next; -}; - -struct Scanbeam { - long64 Y; - Scanbeam *next; -}; - -struct OutPt; //forward declaration - -struct OutRec { - int idx; - bool isHole; - OutRec *FirstLeft; //see comments in clipper.pas - PolyNode *polyNode; - OutPt *pts; - OutPt *bottomPt; -}; - -struct OutPt { - int idx; - IntPoint pt; - OutPt *next; - OutPt *prev; -}; - -struct JoinRec { - IntPoint pt1a; - IntPoint pt1b; - int poly1Idx; - IntPoint pt2a; - IntPoint pt2b; - int poly2Idx; -}; - -struct HorzJoinRec { - TEdge *edge; - int savedIdx; -}; - -struct IntRect { long64 left; long64 top; long64 right; long64 bottom; }; - -typedef std::vector < OutRec* > PolyOutList; -typedef std::vector < TEdge* > EdgeList; -typedef std::vector < JoinRec* > JoinList; -typedef std::vector < HorzJoinRec* > HorzJoinList; - -//ClipperBase is the ancestor to the Clipper class. It should not be -//instantiated directly. This class simply abstracts the conversion of sets of -//polygon coordinates into edge objects that are stored in a LocalMinima list. -class ClipperBase -{ -public: - ClipperBase(); - virtual ~ClipperBase(); - bool AddPolygon(const Polygon &pg, PolyType polyType); - bool AddPolygons( const Polygons &ppg, PolyType polyType); - virtual void Clear(); - IntRect GetBounds(); -protected: - void DisposeLocalMinimaList(); - TEdge* AddBoundsToLML(TEdge *e); - void PopLocalMinima(); - virtual void Reset(); - void InsertLocalMinima(LocalMinima *newLm); - LocalMinima *m_CurrentLM; - LocalMinima *m_MinimaList; - bool m_UseFullRange; - EdgeList m_edges; -}; - -class Clipper : public virtual ClipperBase -{ -public: - Clipper(); - ~Clipper(); - bool Execute(ClipType clipType, - Polygons &solution, - PolyFillType subjFillType = pftEvenOdd, - PolyFillType clipFillType = pftEvenOdd); - bool Execute(ClipType clipType, - PolyTree &polytree, - PolyFillType subjFillType = pftEvenOdd, - PolyFillType clipFillType = pftEvenOdd); - void Clear(); - bool ReverseSolution() {return m_ReverseOutput;}; - void ReverseSolution(bool value) {m_ReverseOutput = value;}; -protected: - void Reset(); - virtual bool ExecuteInternal(); -private: - PolyOutList m_PolyOuts; - JoinList m_Joins; - HorzJoinList m_HorizJoins; - ClipType m_ClipType; - Scanbeam *m_Scanbeam; - TEdge *m_ActiveEdges; - TEdge *m_SortedEdges; - IntersectNode *m_IntersectNodes; - bool m_ExecuteLocked; - PolyFillType m_ClipFillType; - PolyFillType m_SubjFillType; - bool m_ReverseOutput; - bool m_UsingPolyTree; - void DisposeScanbeamList(); - void SetWindingCount(TEdge& edge); - bool IsEvenOddFillType(const TEdge& edge) const; - bool IsEvenOddAltFillType(const TEdge& edge) const; - void InsertScanbeam(const long64 Y); - long64 PopScanbeam(); - void InsertLocalMinimaIntoAEL(const long64 botY); - void InsertEdgeIntoAEL(TEdge *edge); - void AddEdgeToSEL(TEdge *edge); - void CopyAELToSEL(); - void DeleteFromSEL(TEdge *e); - void DeleteFromAEL(TEdge *e); - void UpdateEdgeIntoAEL(TEdge *&e); - void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); - bool IsContributing(const TEdge& edge) const; - bool IsTopHorz(const long64 XPos); - void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); - void DoMaxima(TEdge *e, long64 topY); - void ProcessHorizontals(); - void ProcessHorizontal(TEdge *horzEdge); - void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); - void AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); - void AppendPolygon(TEdge *e1, TEdge *e2); - void DoEdge1(TEdge *edge1, TEdge *edge2, const IntPoint &pt); - void DoEdge2(TEdge *edge1, TEdge *edge2, const IntPoint &pt); - void DoBothEdges(TEdge *edge1, TEdge *edge2, const IntPoint &pt); - void IntersectEdges(TEdge *e1, TEdge *e2, - const IntPoint &pt, const IntersectProtects protects); - OutRec* CreateOutRec(); - void AddOutPt(TEdge *e, const IntPoint &pt); - void DisposeAllPolyPts(); - void DisposeOutRec(PolyOutList::size_type index); - bool ProcessIntersections(const long64 botY, const long64 topY); - void AddIntersectNode(TEdge *e1, TEdge *e2, const IntPoint &pt); - void BuildIntersectList(const long64 botY, const long64 topY); - void ProcessIntersectList(); - void ProcessEdgesAtTopOfScanbeam(const long64 topY); - void BuildResult(Polygons& polys); - void BuildResult2(PolyTree& polytree); - void SetHoleState(TEdge *e, OutRec *OutRec); - void DisposeIntersectNodes(); - bool FixupIntersections(); - void FixupOutPolygon(OutRec &outRec); - bool IsHole(TEdge *e); - void FixHoleLinkage(OutRec &outRec); - void AddJoin(TEdge *e1, TEdge *e2, int e1OutIdx = -1, int e2OutIdx = -1); - void ClearJoins(); - void AddHorzJoin(TEdge *e, int idx); - void ClearHorzJoins(); - bool JoinPoints(const JoinRec *j, OutPt *&p1, OutPt *&p2); - void FixupJoinRecs(JoinRec *j, OutPt *pt, unsigned startIdx); - void JoinCommonEdges(); - void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); - void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec); -}; - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -class clipperException : public std::exception -{ - public: - clipperException(const char* description): m_descr(description) {} - virtual ~clipperException() throw() {} - virtual const char* what() const throw() {return m_descr.c_str();} - private: - std::string m_descr; -}; -//------------------------------------------------------------------------------ - -} //ClipperLib namespace - -#endif //clipper_hpp +/******************************************************************************* +* * +* Author : Angus Johnson * +* Version : 5.1.5 * +* Date : 4 May 2013 * +* Website : http://www.angusj.com * +* Copyright : Angus Johnson 2010-2013 * +* * +* License: * +* Use, modification & distribution is subject to Boost Software License Ver 1. * +* http://www.boost.org/LICENSE_1_0.txt * +* * +* Attributions: * +* The code in this library is an extension of Bala Vatti's clipping algorithm: * +* "A generic solution to polygon clipping" * +* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * +* http://portal.acm.org/citation.cfm?id=129906 * +* * +* Computer graphics and geometric modeling: implementation and algorithms * +* By Max K. Agoston * +* Springer; 1 edition (January 4, 2005) * +* http://books.google.com/books?q=vatti+clipping+agoston * +* * +* See also: * +* "Polygon Offsetting by Computing Winding Numbers" * +* Paper no. DETC2005-85513 pp. 565-575 * +* ASME 2005 International Design Engineering Technical Conferences * +* and Computers and Information in Engineering Conference (IDETC/CIE2005) * +* September 24-28, 2005 , Long Beach, California, USA * +* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * +* * +*******************************************************************************/ + +#ifndef clipper_hpp +#define clipper_hpp + +#include + +#include +#include +#include +#include +#include + +namespace ClipperLib { + +enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; +enum PolyType { ptSubject, ptClip }; +//By far the most widely used winding rules for polygon filling are +//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) +//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) +//see http://glprogramming.com/red/chapter11.html +enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; + +typedef signed long long long64; +typedef unsigned long long ulong64; + +struct IntPoint { +public: + long64 X; + long64 Y; + IntPoint(long64 x = 0, long64 y = 0): X(x), Y(y) {}; + friend std::ostream& operator <<(std::ostream &s, IntPoint &p); +}; + +typedef std::vector< IntPoint > Polygon; +typedef std::vector< Polygon > Polygons; + + +std::ostream& operator <<(std::ostream &s, Polygon &p); +std::ostream& operator <<(std::ostream &s, Polygons &p); + +class PolyNode; +typedef std::vector< PolyNode* > PolyNodes; + +class PolyNode +{ +public: + PolyNode(); + Polygon Contour; + PolyNodes Childs; + PolyNode* Parent; + PolyNode* GetNext() const; + bool IsHole() const; + int ChildCount() const; +private: + PolyNode* GetNextSiblingUp() const; + unsigned Index; //node index in Parent.Childs + void AddChild(PolyNode& child); + friend class Clipper; //to access Index +}; + +class PolyTree: public PolyNode +{ +public: + ~PolyTree(){Clear();}; + PolyNode* GetFirst() const; + void Clear(); + int Total() const; +private: + PolyNodes AllNodes; + friend class Clipper; //to access AllNodes +}; + +enum JoinType { jtSquare, jtRound, jtMiter }; + +bool Orientation(const Polygon &poly); +MAPNIK_DECL double Area(const Polygon &poly); + +void OffsetPolygons(const Polygons &in_polys, Polygons &out_polys, + double delta, JoinType jointype = jtSquare, double limit = 0, bool autoFix = true); + +void SimplifyPolygon(const Polygon &in_poly, Polygons &out_polys, PolyFillType fillType = pftEvenOdd); +void SimplifyPolygons(const Polygons &in_polys, Polygons &out_polys, PolyFillType fillType = pftEvenOdd); +void SimplifyPolygons(Polygons &polys, PolyFillType fillType = pftEvenOdd); + +void CleanPolygon(Polygon& in_poly, Polygon& out_poly, double distance = 1.415); +void CleanPolygons(Polygons& in_polys, Polygons& out_polys, double distance = 1.415); + +void PolyTreeToPolygons(PolyTree& polytree, Polygons& polygons); + +void ReversePolygon(Polygon& p); +void ReversePolygons(Polygons& p); + +//used internally ... +enum EdgeSide { esLeft = 1, esRight = 2}; +enum IntersectProtects { ipNone = 0, ipLeft = 1, ipRight = 2, ipBoth = 3 }; + +struct TEdge { + long64 xbot; + long64 ybot; + long64 xcurr; + long64 ycurr; + long64 xtop; + long64 ytop; + double dx; + long64 deltaX; + long64 deltaY; + PolyType polyType; + EdgeSide side; + int windDelta; //1 or -1 depending on winding direction + int windCnt; + int windCnt2; //winding count of the opposite polytype + int outIdx; + TEdge *next; + TEdge *prev; + TEdge *nextInLML; + TEdge *nextInAEL; + TEdge *prevInAEL; + TEdge *nextInSEL; + TEdge *prevInSEL; +}; + +struct IntersectNode { + TEdge *edge1; + TEdge *edge2; + IntPoint pt; + IntersectNode *next; +}; + +struct LocalMinima { + long64 Y; + TEdge *leftBound; + TEdge *rightBound; + LocalMinima *next; +}; + +struct Scanbeam { + long64 Y; + Scanbeam *next; +}; + +struct OutPt; //forward declaration + +struct OutRec { + int idx; + bool isHole; + OutRec *FirstLeft; //see comments in clipper.pas + PolyNode *polyNode; + OutPt *pts; + OutPt *bottomPt; +}; + +struct OutPt { + int idx; + IntPoint pt; + OutPt *next; + OutPt *prev; +}; + +struct JoinRec { + IntPoint pt1a; + IntPoint pt1b; + int poly1Idx; + IntPoint pt2a; + IntPoint pt2b; + int poly2Idx; +}; + +struct HorzJoinRec { + TEdge *edge; + int savedIdx; +}; + +struct IntRect { long64 left; long64 top; long64 right; long64 bottom; }; + +typedef std::vector < OutRec* > PolyOutList; +typedef std::vector < TEdge* > EdgeList; +typedef std::vector < JoinRec* > JoinList; +typedef std::vector < HorzJoinRec* > HorzJoinList; + +//ClipperBase is the ancestor to the Clipper class. It should not be +//instantiated directly. This class simply abstracts the conversion of sets of +//polygon coordinates into edge objects that are stored in a LocalMinima list. +class MAPNIK_DECL ClipperBase +{ +public: + ClipperBase(); + virtual ~ClipperBase(); + bool AddPolygon(const Polygon &pg, PolyType polyType); + bool AddPolygons( const Polygons &ppg, PolyType polyType); + virtual void Clear(); + IntRect GetBounds(); +protected: + void DisposeLocalMinimaList(); + TEdge* AddBoundsToLML(TEdge *e); + void PopLocalMinima(); + virtual void Reset(); + void InsertLocalMinima(LocalMinima *newLm); + LocalMinima *m_CurrentLM; + LocalMinima *m_MinimaList; + bool m_UseFullRange; + EdgeList m_edges; +}; + +class MAPNIK_DECL Clipper : public virtual ClipperBase +{ +public: + Clipper(); + ~Clipper(); + bool Execute(ClipType clipType, + Polygons &solution, + PolyFillType subjFillType = pftEvenOdd, + PolyFillType clipFillType = pftEvenOdd); + bool Execute(ClipType clipType, + PolyTree &polytree, + PolyFillType subjFillType = pftEvenOdd, + PolyFillType clipFillType = pftEvenOdd); + void Clear(); + bool ReverseSolution() {return m_ReverseOutput;}; + void ReverseSolution(bool value) {m_ReverseOutput = value;}; + bool ForceSimple() {return m_ForceSimple;}; + void ForceSimple(bool value) {m_ForceSimple = value;}; +protected: + void Reset(); + virtual bool ExecuteInternal(); +private: + PolyOutList m_PolyOuts; + JoinList m_Joins; + HorzJoinList m_HorizJoins; + ClipType m_ClipType; + Scanbeam *m_Scanbeam; + TEdge *m_ActiveEdges; + TEdge *m_SortedEdges; + IntersectNode *m_IntersectNodes; + bool m_ExecuteLocked; + PolyFillType m_ClipFillType; + PolyFillType m_SubjFillType; + bool m_ReverseOutput; + bool m_UsingPolyTree; + bool m_ForceSimple; + void DisposeScanbeamList(); + void SetWindingCount(TEdge& edge); + bool IsEvenOddFillType(const TEdge& edge) const; + bool IsEvenOddAltFillType(const TEdge& edge) const; + void InsertScanbeam(const long64 Y); + long64 PopScanbeam(); + void InsertLocalMinimaIntoAEL(const long64 botY); + void InsertEdgeIntoAEL(TEdge *edge); + void AddEdgeToSEL(TEdge *edge); + void CopyAELToSEL(); + void DeleteFromSEL(TEdge *e); + void DeleteFromAEL(TEdge *e); + void UpdateEdgeIntoAEL(TEdge *&e); + void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); + bool IsContributing(const TEdge& edge) const; + bool IsTopHorz(const long64 XPos); + void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); + void DoMaxima(TEdge *e, long64 topY); + void ProcessHorizontals(); + void ProcessHorizontal(TEdge *horzEdge); + void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); + void 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, const IntersectProtects protects); + OutRec* CreateOutRec(); + void AddOutPt(TEdge *e, const IntPoint &pt); + void DisposeAllPolyPts(); + void DisposeOutRec(PolyOutList::size_type index); + bool ProcessIntersections(const long64 botY, const long64 topY); + void AddIntersectNode(TEdge *e1, TEdge *e2, const IntPoint &pt); + void BuildIntersectList(const long64 botY, const long64 topY); + void ProcessIntersectList(); + void ProcessEdgesAtTopOfScanbeam(const long64 topY); + void BuildResult(Polygons& polys); + void BuildResult2(PolyTree& polytree); + void SetHoleState(TEdge *e, OutRec *outrec); + void DisposeIntersectNodes(); + bool FixupIntersectionOrder(); + void FixupOutPolygon(OutRec &outrec); + bool IsHole(TEdge *e); + void FixHoleLinkage(OutRec &outrec); + void AddJoin(TEdge *e1, TEdge *e2, int e1OutIdx = -1, int e2OutIdx = -1); + void ClearJoins(); + void AddHorzJoin(TEdge *e, int idx); + void ClearHorzJoins(); + bool JoinPoints(const JoinRec *j, OutPt *&p1, OutPt *&p2); + void FixupJoinRecs(JoinRec *j, OutPt *pt, unsigned startIdx); + void JoinCommonEdges(); + void DoSimplePolygons(); + void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); + void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec); +}; + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +class clipperException : public std::exception +{ + public: + clipperException(const char* description): m_descr(description) {} + virtual ~clipperException() throw() {} + virtual const char* what() const throw() {return m_descr.c_str();} + private: + std::string m_descr; +}; +//------------------------------------------------------------------------------ + +} //ClipperLib namespace + +#endif //clipper_hpp + + diff --git a/deps/clipper/src/clipper.cpp b/deps/clipper/src/clipper.cpp old mode 100644 new mode 100755 index 58de5fe1c..7f4ceceb6 --- a/deps/clipper/src/clipper.cpp +++ b/deps/clipper/src/clipper.cpp @@ -1,3469 +1,3574 @@ -/******************************************************************************* - * * - * Author : Angus Johnson * - * Version : 5.1.0 * - * Date : 1 February 2013 * - * Website : http://www.angusj.com * - * Copyright : Angus Johnson 2010-2013 * - * * - * License: * - * Use, modification & distribution is subject to Boost Software License Ver 1. * - * http://www.boost.org/LICENSE_1_0.txt * - * * - * Attributions: * - * The code in this library is an extension of Bala Vatti's clipping algorithm: * - * "A generic solution to polygon clipping" * - * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * - * http://portal.acm.org/citation.cfm?id=129906 * - * * - * Computer graphics and geometric modeling: implementation and algorithms * - * By Max K. Agoston * - * Springer; 1 edition (January 4, 2005) * - * http://books.google.com/books?q=vatti+clipping+agoston * - * * - * See also: * - * "Polygon Offsetting by Computing Winding Numbers" * - * Paper no. DETC2005-85513 pp. 565-575 * - * ASME 2005 International Design Engineering Technical Conferences * - * and Computers and Information in Engineering Conference (IDETC/CIE2005) * - * September 24-28, 2005 , Long Beach, California, USA * - * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * - * * - *******************************************************************************/ - -/******************************************************************************* - * * - * This is a translation of the Delphi Clipper library and the naming style * - * used has retained a Delphi flavour. * - * * - *******************************************************************************/ - -#include "clipper.hpp" -#include -#include -#include -#include -#include -#include -#include - -namespace ClipperLib { - -static long64 const loRange = 0x3FFFFFFF; -static long64 const hiRange = 0x3FFFFFFFFFFFFFFFLL; -static double const pi = 3.141592653589793238; -enum Direction { dRightToLeft, dLeftToRight }; - -#define HORIZONTAL (-1.0E+40) -#define TOLERANCE (1.0e-20) -#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) -#define NEAR_EQUAL(a, b) NEAR_ZERO((a) - (b)) - -inline long64 Abs(long64 val) -{ - return val < 0 ? -val : val; -} - -//------------------------------------------------------------------------------ -// PolyTree methods ... -//------------------------------------------------------------------------------ - -void PolyTree::Clear() -{ - for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) - delete AllNodes[i]; - AllNodes.resize(0); - Childs.resize(0); -} -//------------------------------------------------------------------------------ - -PolyNode* PolyTree::GetFirst() -{ - if (Childs.size() > 0) - return Childs[0]; - else - return 0; -} -//------------------------------------------------------------------------------ - -int PolyTree::Total() -{ - return AllNodes.size(); -} - -//------------------------------------------------------------------------------ -// PolyNode methods ... -//------------------------------------------------------------------------------ - - -int PolyNode::ChildCount() -{ - return Childs.size(); -} -//------------------------------------------------------------------------------ - -void PolyNode::AddChild(PolyNode& child) -{ - unsigned cnt = Childs.size(); - Childs.push_back(&child); - child.Parent = this; - child.Index = cnt; -} -//------------------------------------------------------------------------------ - -PolyNode* PolyNode::GetNext() -{ - if (Childs.size() > 0) - return Childs[0]; - else - return GetNextSiblingUp(); -} -//------------------------------------------------------------------------------ - -PolyNode* PolyNode::GetNextSiblingUp() -{ - if (!Parent) //protects against PolyTree.GetNextSiblingUp() - return 0; - else if (Index == Parent->Childs.size() - 1) - return Parent->GetNextSiblingUp(); - else - return Parent->Childs[Index + 1]; -} -//------------------------------------------------------------------------------ - -bool PolyNode::IsHole() -{ - bool result = true; - PolyNode* node = Parent; - while (node) - { - result = !result; - node = node->Parent; - } - return result; -} - -//------------------------------------------------------------------------------ -// Int128 class (enables safe math on signed 64bit integers) -// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 -// Int128 val2((long64)9223372036854775807); -// Int128 val3 = val1 * val2; -// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) -//------------------------------------------------------------------------------ - -class Int128 -{ -public: - - ulong64 lo; - long64 hi; - - Int128(long64 _lo = 0) - { - lo = (ulong64)_lo; - if (_lo < 0) hi = -1; else hi = 0; - } - - - Int128(const Int128 &val): lo(val.lo), hi(val.hi){} - - Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} - - long64 operator = (const long64 &val) - { - lo = (ulong64)val; - if (val < 0) hi = -1; else hi = 0; - return val; - } - - bool operator == (const Int128 &val) const - {return (hi == val.hi && lo == val.lo);} - - bool operator != (const Int128 &val) const - { return !(*this == val);} - - bool operator > (const Int128 &val) const - { - if (hi != val.hi) - return hi > val.hi; - else - return lo > val.lo; - } - - bool operator < (const Int128 &val) const - { - if (hi != val.hi) - return hi < val.hi; - else - return lo < val.lo; - } - - bool operator >= (const Int128 &val) const - { return !(*this < val);} - - bool operator <= (const Int128 &val) const - { return !(*this > val);} - - Int128& operator += (const Int128 &rhs) - { - hi += rhs.hi; - lo += rhs.lo; - if (lo < rhs.lo) hi++; - return *this; - } - - Int128 operator + (const Int128 &rhs) const - { - Int128 result(*this); - result+= rhs; - return result; - } - - Int128& operator -= (const Int128 &rhs) - { - *this += -rhs; - return *this; - } - - Int128 operator - (const Int128 &rhs) const - { - Int128 result(*this); - result -= rhs; - return result; - } - - 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 ((long64)divisor.lo < 0) divisor.hi++; - divisor.lo <<= 1; - - cntr.hi <<= 1; - if ((long64)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); - else - return Int128(0); - } - - double AsDouble() const - { - const double shift64 = 18446744073709551616.0; //2^64 - if (hi < 0) - { - if (lo == 0) return (double)hi * shift64; - else return -(double)(~lo + ~hi * shift64); - } - else - return (double)(lo + hi * shift64); - } -}; - -Int128 Int128Mul (long64 lhs, long64 rhs) -{ - bool negate = (lhs < 0) != (rhs < 0); - - if (lhs < 0) lhs = -lhs; - ulong64 int1Hi = ulong64(lhs) >> 32; - ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); - - if (rhs < 0) rhs = -rhs; - ulong64 int2Hi = ulong64(rhs) >> 32; - ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); - - //nb: see comments in clipper.pas - ulong64 a = int1Hi * int2Hi; - ulong64 b = int1Lo * int2Lo; - ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; - - Int128 tmp; - 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; -} - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -bool FullRangeNeeded(const Polygon &pts) -{ - bool result = false; - for (Polygon::size_type i = 0; i < pts.size(); ++i) - { - if (Abs(pts[i].X) > hiRange || Abs(pts[i].Y) > hiRange) - throw "Coordinate exceeds range bounds."; - else if (Abs(pts[i].X) > loRange || Abs(pts[i].Y) > loRange) - result = true; - } - return result; -} -//------------------------------------------------------------------------------ - -bool Orientation(const Polygon &poly) -{ - return Area(poly) >= 0; -} -//------------------------------------------------------------------------------ - -inline bool PointsEqual( const IntPoint &pt1, const IntPoint &pt2) -{ - return ( pt1.X == pt2.X && pt1.Y == pt2.Y ); -} -//------------------------------------------------------------------------------ - -double Area(const Polygon &poly) -{ - int highI = (int)poly.size() -1; - if (highI < 2) return 0; - - if (FullRangeNeeded(poly)) { - Int128 a; - a = Int128Mul(poly[highI].X + poly[0].X, poly[0].Y - poly[highI].Y); - for (int i = 1; i <= highI; ++i) - a += Int128Mul(poly[i - 1].X + poly[i].X, poly[i].Y - poly[i -1].Y); - return a.AsDouble() / 2; - } - else - { - 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 Area(const OutRec &outRec, bool UseFullInt64Range) -{ - OutPt *op = outRec.pts; - if (!op) return 0; - if (UseFullInt64Range) { - Int128 a(0); - do { - a += Int128Mul(op->pt.X + op->prev->pt.X, op->prev->pt.Y - op->pt.Y); - op = op->next; - } while (op != outRec.pts); - return a.AsDouble() / 2; - } - else - { - double a = 0; - do { - a = a + (op->pt.X + op->prev->pt.X) * (op->prev->pt.Y - op->pt.Y); - op = op->next; - } while (op != outRec.pts); - return a / 2; - } -} -//------------------------------------------------------------------------------ - -bool PointIsVertex(const IntPoint &pt, OutPt *pp) -{ - OutPt *pp2 = pp; - do - { - if (PointsEqual(pp2->pt, pt)) return true; - pp2 = pp2->next; - } - while (pp2 != pp); - return false; -} -//------------------------------------------------------------------------------ - -bool PointInPolygon(const IntPoint &pt, OutPt *pp, bool UseFullInt64Range) -{ - OutPt *pp2 = pp; - bool result = false; - if (UseFullInt64Range) { - do - { - if ((((pp2->pt.Y <= pt.Y) && (pt.Y < pp2->prev->pt.Y)) || - ((pp2->prev->pt.Y <= pt.Y) && (pt.Y < pp2->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); - } - else - { - do - { - if ((((pp2->pt.Y <= pt.Y) && (pt.Y < pp2->prev->pt.Y)) || - ((pp2->prev->pt.Y <= pt.Y) && (pt.Y < pp2->pt.Y))) && - (pt.X < (pp2->prev->pt.X - pp2->pt.X) * (pt.Y - pp2->pt.Y) / - (pp2->prev->pt.Y - pp2->pt.Y) + pp2->pt.X )) result = !result; - pp2 = pp2->next; - } - while (pp2 != pp); - } - return result; -} -//------------------------------------------------------------------------------ - -bool SlopesEqual(TEdge &e1, TEdge &e2, bool UseFullInt64Range) -{ - if (UseFullInt64Range) - return Int128Mul(e1.deltaY, e2.deltaX) == Int128Mul(e1.deltaX, e2.deltaY); - else return e1.deltaY * e2.deltaX == e1.deltaX * e2.deltaY; -} -//------------------------------------------------------------------------------ - -bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, - const IntPoint pt3, bool UseFullInt64Range) -{ - if (UseFullInt64Range) - return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); - else return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); -} -//------------------------------------------------------------------------------ - -bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, - const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) -{ - if (UseFullInt64Range) - return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); - else return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); -} -//------------------------------------------------------------------------------ - -double GetDx(const IntPoint pt1, const IntPoint pt2) -{ - return (pt1.Y == pt2.Y) ? - HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); -} -//--------------------------------------------------------------------------- - -void SetDx(TEdge &e) -{ - e.deltaX = (e.xtop - e.xbot); - e.deltaY = (e.ytop - e.ybot); - - if (e.deltaY == 0) e.dx = HORIZONTAL; - else e.dx = (double)(e.deltaX) / e.deltaY; -} -//--------------------------------------------------------------------------- - -void SwapSides(TEdge &edge1, TEdge &edge2) -{ - EdgeSide side = edge1.side; - edge1.side = edge2.side; - edge2.side = side; -} -//------------------------------------------------------------------------------ - -void SwapPolyIndexes(TEdge &edge1, TEdge &edge2) -{ - int outIdx = edge1.outIdx; - edge1.outIdx = edge2.outIdx; - edge2.outIdx = outIdx; -} -//------------------------------------------------------------------------------ - -inline long64 Round(double val) -{ - return (val < 0) ? static_cast(val - 0.5) : static_cast(val + 0.5); -} -//------------------------------------------------------------------------------ - -long64 TopX(TEdge &edge, const long64 currentY) -{ - return ( currentY == edge.ytop ) ? - edge.xtop : edge.xbot + Round(edge.dx *(currentY - edge.ybot)); -} -//------------------------------------------------------------------------------ - -bool IntersectPoint(TEdge &edge1, TEdge &edge2, - IntPoint &ip, bool UseFullInt64Range) -{ - double b1, b2; - if (SlopesEqual(edge1, edge2, UseFullInt64Range)) return false; - else if (NEAR_ZERO(edge1.dx)) - { - ip.X = edge1.xbot; - if (NEAR_EQUAL(edge2.dx, HORIZONTAL)) - { - ip.Y = edge2.ybot; - } else - { - b2 = edge2.ybot - (edge2.xbot / edge2.dx); - ip.Y = Round(ip.X / edge2.dx + b2); - } - } - else if (NEAR_ZERO(edge2.dx)) - { - ip.X = edge2.xbot; - if (NEAR_EQUAL(edge1.dx, HORIZONTAL)) - { - ip.Y = edge1.ybot; - } else - { - b1 = edge1.ybot - (edge1.xbot / edge1.dx); - ip.Y = Round(ip.X / edge1.dx + b1); - } - } else - { - b1 = edge1.xbot - edge1.ybot * edge1.dx; - b2 = edge2.xbot - edge2.ybot * edge2.dx; - double q = (b2-b1) / (edge1.dx - edge2.dx); - ip.Y = Round(q); - if (std::fabs(edge1.dx) < std::fabs(edge2.dx)) - ip.X = Round(edge1.dx * q + b1); - else - ip.X = Round(edge2.dx * q + b2); - } - - if (ip.Y < edge1.ytop || ip.Y < edge2.ytop) - { - if (edge1.ytop > edge2.ytop) - { - ip.X = edge1.xtop; - ip.Y = edge1.ytop; - return TopX(edge2, edge1.ytop) < edge1.xtop; - } else - { - ip.X = edge2.xtop; - ip.Y = edge2.ytop; - return TopX(edge1, edge2.ytop) > edge2.xtop; - } - } - else - return true; -} -//------------------------------------------------------------------------------ - -void ReversePolyPtLinks(OutPt *pp) -{ - if (!pp) return; - OutPt *pp1, *pp2; - pp1 = pp; - do { - pp2 = pp1->next; - pp1->next = pp1->prev; - pp1->prev = pp2; - pp1 = pp2; - } while( pp1 != pp ); -} -//------------------------------------------------------------------------------ - -void DisposeOutPts(OutPt*& pp) -{ - if (pp == 0) return; - pp->prev->next = 0; - while( pp ) - { - OutPt *tmpPp = pp; - pp = pp->next; - delete tmpPp ; - } -} -//------------------------------------------------------------------------------ - -void InitEdge(TEdge *e, TEdge *eNext, - TEdge *ePrev, const IntPoint &pt, PolyType polyType) -{ - std::memset( e, 0, sizeof( TEdge )); - - e->next = eNext; - e->prev = ePrev; - e->xcurr = pt.X; - e->ycurr = pt.Y; - if (e->ycurr >= e->next->ycurr) - { - e->xbot = e->xcurr; - e->ybot = e->ycurr; - e->xtop = e->next->xcurr; - e->ytop = e->next->ycurr; - e->windDelta = 1; - } else - { - e->xtop = e->xcurr; - e->ytop = e->ycurr; - e->xbot = e->next->xcurr; - e->ybot = e->next->ycurr; - e->windDelta = -1; - } - SetDx(*e); - e->polyType = polyType; - e->outIdx = -1; -} -//------------------------------------------------------------------------------ - -inline void SwapX(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.] - e.xcurr = e.xtop; - e.xtop = e.xbot; - e.xbot = e.xcurr; -} -//------------------------------------------------------------------------------ - -void SwapPoints(IntPoint &pt1, IntPoint &pt2) -{ - IntPoint tmp = pt1; - pt1 = pt2; - pt2 = tmp; -} -//------------------------------------------------------------------------------ - -bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, - IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) -{ - //precondition: segments are colinear. - 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; - } 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; - } -} -//------------------------------------------------------------------------------ - -bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) -{ - OutPt *p = btmPt1->prev; - while (PointsEqual(p->pt, btmPt1->pt) && (p != btmPt1)) p = p->prev; - double dx1p = std::fabs(GetDx(btmPt1->pt, p->pt)); - p = btmPt1->next; - while (PointsEqual(p->pt, btmPt1->pt) && (p != btmPt1)) p = p->next; - double dx1n = std::fabs(GetDx(btmPt1->pt, p->pt)); - - p = btmPt2->prev; - while (PointsEqual(p->pt, btmPt2->pt) && (p != btmPt2)) p = p->prev; - double dx2p = std::fabs(GetDx(btmPt2->pt, p->pt)); - p = btmPt2->next; - while (PointsEqual(p->pt, btmPt2->pt) && (p != btmPt2)) p = p->next; - double dx2n = std::fabs(GetDx(btmPt2->pt, p->pt)); - return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); -} -//------------------------------------------------------------------------------ - -OutPt* GetBottomPt(OutPt *pp) -{ - OutPt* dups = 0; - OutPt* p = pp->next; - while (p != pp) - { - 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) - { - if (p->pt.X < pp->pt.X) - { - dups = 0; - pp = p; - } else - { - if (p->next != pp && p->prev != pp) dups = p; - } - } - p = p->next; - } - if (dups) - { - //there appears to be at least 2 vertices at bottomPt so ... - while (dups != p) - { - if (!FirstIsBottomPt(p, dups)) pp = dups; - dups = dups->next; - while (!PointsEqual(dups->pt, pp->pt)) dups = dups->next; - } - } - return pp; -} -//------------------------------------------------------------------------------ - -bool FindSegment(OutPt* &pp, 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, true) && - SlopesEqual(pt1a, pt2a, pp->pt, true) && - GetOverlapSegment(pt1a, pt2a, pp->pt, pp->prev->pt, pt1, pt2)) - return true; - pp = pp->next; - } - while (pp != pp2); - return false; -} -//------------------------------------------------------------------------------ - -bool Pt3IsBetweenPt1AndPt2(const IntPoint pt1, - const IntPoint pt2, const IntPoint pt3) -{ - if (PointsEqual(pt1, pt3) || PointsEqual(pt2, pt3)) return true; - else if (pt1.X != pt2.X) return (pt1.X < pt3.X) == (pt3.X < pt2.X); - else return (pt1.Y < pt3.Y) == (pt3.Y < pt2.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; -} - -//------------------------------------------------------------------------------ -// ClipperBase class methods ... -//------------------------------------------------------------------------------ - -ClipperBase::ClipperBase() //constructor -{ - m_MinimaList = 0; - m_CurrentLM = 0; - m_UseFullRange = true; -} -//------------------------------------------------------------------------------ - -ClipperBase::~ClipperBase() //destructor -{ - Clear(); -} -//------------------------------------------------------------------------------ - -bool ClipperBase::AddPolygon( const Polygon &pg, PolyType polyType) -{ - int len = (int)pg.size(); - if (len < 3) return false; - - Polygon p(len); - p[0] = pg[0]; - int j = 0; - - long64 maxVal; - if (m_UseFullRange) maxVal = hiRange; else maxVal = loRange; - - for (int i = 0; i < len; ++i) - { - if (Abs(pg[i].X) > maxVal || Abs(pg[i].Y) > maxVal) - { - if (Abs(pg[i].X) > hiRange || Abs(pg[i].Y) > hiRange) - throw "Coordinate exceeds range bounds"; - maxVal = hiRange; - m_UseFullRange = true; - } - - if (i == 0 || PointsEqual(p[j], pg[i])) continue; - else if (j > 0 && SlopesEqual(p[j-1], p[j], pg[i], m_UseFullRange)) - { - if (PointsEqual(p[j-1], pg[i])) j--; - } else j++; - p[j] = pg[i]; - } - if (j < 2) return false; - - len = j+1; - while (len > 2) - { - //nb: test for point equality before testing slopes ... - if (PointsEqual(p[j], p[0])) j--; - else if (PointsEqual(p[0], p[1]) || - SlopesEqual(p[j], p[0], p[1], m_UseFullRange)) - p[0] = p[j--]; - else if (SlopesEqual(p[j-1], p[j], p[0], m_UseFullRange)) j--; - else if (SlopesEqual(p[0], p[1], p[2], m_UseFullRange)) - { - for (int i = 2; i <= j; ++i) p[i-1] = p[i]; - j--; - } - else break; - len--; - } - if (len < 3) return false; - - //create a new edge array ... - TEdge *edges = new TEdge [len]; - m_edges.push_back(edges); - - //convert vertices to a double-linked-list of edges and initialize ... - edges[0].xcurr = p[0].X; - edges[0].ycurr = p[0].Y; - InitEdge(&edges[len-1], &edges[0], &edges[len-2], p[len-1], polyType); - for (int i = len-2; i > 0; --i) - InitEdge(&edges[i], &edges[i+1], &edges[i-1], p[i], polyType); - InitEdge(&edges[0], &edges[1], &edges[len-1], p[0], polyType); - - //reset xcurr & ycurr and find 'eHighest' (given the Y axis coordinates - //increase downward so the 'highest' edge will have the smallest ytop) ... - TEdge *e = &edges[0]; - TEdge *eHighest = e; - do - { - e->xcurr = e->xbot; - e->ycurr = e->ybot; - if (e->ytop < eHighest->ytop) eHighest = e; - e = e->next; - } - while ( e != &edges[0]); - - //make sure eHighest is positioned so the following loop works safely ... - if (eHighest->windDelta > 0) eHighest = eHighest->next; - if (NEAR_EQUAL(eHighest->dx, HORIZONTAL)) eHighest = eHighest->next; - - //finally insert each local minima ... - e = eHighest; - do { - e = AddBoundsToLML(e); - } - while( e != eHighest ); - return true; -} -//------------------------------------------------------------------------------ - -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; - } -} -//------------------------------------------------------------------------------ - -TEdge* ClipperBase::AddBoundsToLML(TEdge *e) -{ - //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->nextInLML = 0; - e = e->next; - for (;;) - { - if (NEAR_EQUAL(e->dx, HORIZONTAL)) - { - //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. - if (e->next->ytop < e->ytop && e->next->xbot > e->prev->xbot) break; - if (e->xtop != e->prev->xbot) SwapX(*e); - e->nextInLML = e->prev; - } - else if (e->ycurr == e->prev->ycurr) break; - else e->nextInLML = e->prev; - e = e->next; - } - - //e and e.prev are now at a local minima ... - LocalMinima* newLm = new LocalMinima; - newLm->next = 0; - newLm->Y = e->prev->ybot; - - if ( NEAR_EQUAL(e->dx, HORIZONTAL) ) //horizontal edges never start a left bound - { - if (e->xbot != e->prev->xbot) SwapX(*e); - newLm->leftBound = e->prev; - newLm->rightBound = e; - } else if (e->dx < e->prev->dx) - { - newLm->leftBound = e->prev; - newLm->rightBound = e; - } else - { - newLm->leftBound = e; - newLm->rightBound = e->prev; - } - newLm->leftBound->side = esLeft; - newLm->rightBound->side = esRight; - InsertLocalMinima( newLm ); - - for (;;) - { - if ( e->next->ytop == e->ytop && !NEAR_EQUAL(e->next->dx, HORIZONTAL) ) break; - e->nextInLML = e->next; - e = e->next; - if ( NEAR_EQUAL(e->dx, HORIZONTAL) && e->xbot != e->prev->xtop) SwapX(*e); - } - return e->next; -} -//------------------------------------------------------------------------------ - -bool ClipperBase::AddPolygons(const Polygons &ppg, PolyType polyType) -{ - bool result = false; - for (Polygons::size_type i = 0; i < ppg.size(); ++i) - if (AddPolygon(ppg[i], polyType)) result = true; - return result; -} -//------------------------------------------------------------------------------ - -void ClipperBase::Clear() -{ - DisposeLocalMinimaList(); - for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) delete [] m_edges[i]; - m_edges.clear(); - m_UseFullRange = false; -} -//------------------------------------------------------------------------------ - -void ClipperBase::Reset() -{ - m_CurrentLM = m_MinimaList; - if( !m_CurrentLM ) return; //ie nothing to process - - //reset all edges ... - LocalMinima* lm = m_MinimaList; - while( lm ) - { - TEdge* e = lm->leftBound; - while( e ) - { - e->xcurr = e->xbot; - e->ycurr = e->ybot; - e->side = esLeft; - e->outIdx = -1; - e = e->nextInLML; - } - e = lm->rightBound; - while( e ) - { - e->xcurr = e->xbot; - e->ycurr = e->ybot; - e->side = esRight; - e->outIdx = -1; - e = e->nextInLML; - } - lm = lm->next; - } -} -//------------------------------------------------------------------------------ - -void ClipperBase::DisposeLocalMinimaList() -{ - while( m_MinimaList ) - { - LocalMinima* tmpLm = m_MinimaList->next; - delete m_MinimaList; - m_MinimaList = tmpLm; - } - m_CurrentLM = 0; -} -//------------------------------------------------------------------------------ - -void ClipperBase::PopLocalMinima() -{ - if( ! m_CurrentLM ) return; - m_CurrentLM = m_CurrentLM->next; -} -//------------------------------------------------------------------------------ - -IntRect ClipperBase::GetBounds() -{ - IntRect result; - LocalMinima* lm = m_MinimaList; - if (!lm) - { - result.left = result.top = result.right = result.bottom = 0; - return result; - } - result.left = lm->leftBound->xbot; - result.top = lm->leftBound->ybot; - result.right = lm->leftBound->xbot; - result.bottom = lm->leftBound->ybot; - while (lm) - { - if (lm->leftBound->ybot > result.bottom) - result.bottom = lm->leftBound->ybot; - TEdge* e = lm->leftBound; - for (;;) { - TEdge* bottomE = e; - while (e->nextInLML) - { - if (e->xbot < result.left) result.left = e->xbot; - if (e->xbot > result.right) result.right = e->xbot; - e = e->nextInLML; - } - if (e->xbot < result.left) result.left = e->xbot; - if (e->xbot > result.right) result.right = e->xbot; - if (e->xtop < result.left) result.left = e->xtop; - if (e->xtop > result.right) result.right = e->xtop; - if (e->ytop < result.top) result.top = e->ytop; - - if (bottomE == lm->leftBound) e = lm->rightBound; - else break; - } - lm = lm->next; - } - return result; -} - - -//------------------------------------------------------------------------------ -// TClipper methods ... -//------------------------------------------------------------------------------ - -Clipper::Clipper() : ClipperBase() //constructor -{ - m_Scanbeam = 0; - m_ActiveEdges = 0; - m_SortedEdges = 0; - m_IntersectNodes = 0; - m_ExecuteLocked = false; - m_UseFullRange = false; - m_ReverseOutput = false; -} -//------------------------------------------------------------------------------ - -Clipper::~Clipper() //destructor -{ - Clear(); - DisposeScanbeamList(); -} -//------------------------------------------------------------------------------ - -void Clipper::Clear() -{ - if (m_edges.size() == 0) return; //avoids problems with ClipperBase destructor - DisposeAllPolyPts(); - ClipperBase::Clear(); -} -//------------------------------------------------------------------------------ - -void Clipper::DisposeScanbeamList() -{ - while ( m_Scanbeam ) { - Scanbeam* sb2 = m_Scanbeam->next; - delete m_Scanbeam; - m_Scanbeam = sb2; - } -} -//------------------------------------------------------------------------------ - -void Clipper::Reset() -{ - ClipperBase::Reset(); - m_Scanbeam = 0; - m_ActiveEdges = 0; - m_SortedEdges = 0; - DisposeAllPolyPts(); - LocalMinima* lm = m_MinimaList; - while (lm) - { - InsertScanbeam(lm->Y); - InsertScanbeam(lm->leftBound->ytop); - lm = lm->next; - } -} -//------------------------------------------------------------------------------ - -bool Clipper::Execute(ClipType clipType, Polygons &solution, - PolyFillType subjFillType, PolyFillType clipFillType) -{ - if( m_ExecuteLocked ) return false; - m_ExecuteLocked = true; - solution.resize(0); - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = false; - bool succeeded = ExecuteInternal(); - if (succeeded) BuildResult(solution); - m_ExecuteLocked = false; - return succeeded; -} -//------------------------------------------------------------------------------ - -bool Clipper::Execute(ClipType clipType, PolyTree& polytree, - PolyFillType subjFillType, PolyFillType clipFillType) -{ - if( m_ExecuteLocked ) return false; - m_ExecuteLocked = true; - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = true; - bool succeeded = ExecuteInternal(); - if (succeeded) BuildResult2(polytree); - m_ExecuteLocked = false; - return succeeded; -} -//------------------------------------------------------------------------------ - -void Clipper::FixHoleLinkage(OutRec &outRec) -{ - //skip OutRecs that (a) contain outermost polygons or - //(b) already have the correct owner/child linkage ... - if (!outRec.FirstLeft || - (outRec.isHole != outRec.FirstLeft->isHole && - outRec.FirstLeft->pts)) return; - - OutRec* orfl = outRec.FirstLeft; - while (orfl && ((orfl->isHole == outRec.isHole) || !orfl->pts)) - orfl = orfl->FirstLeft; - outRec.FirstLeft = orfl; -} -//------------------------------------------------------------------------------ - -bool Clipper::ExecuteInternal() -{ - bool succeeded; - try { - Reset(); - if (!m_CurrentLM ) return true; - long64 botY = PopScanbeam(); - do { - InsertLocalMinimaIntoAEL(botY); - ClearHorzJoins(); - ProcessHorizontals(); - long64 topY = PopScanbeam(); - succeeded = ProcessIntersections(botY, topY); - if (!succeeded) break; - ProcessEdgesAtTopOfScanbeam(topY); - botY = topY; - } while( m_Scanbeam ); - } - catch(...) { - succeeded = false; - } - - if (succeeded) - { - //tidy up output polygons and fix orientations where necessary ... - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec *outRec = m_PolyOuts[i]; - if (!outRec->pts) continue; - FixupOutPolygon(*outRec); - if (!outRec->pts) continue; - - if ((outRec->isHole ^ m_ReverseOutput) == (Area(*outRec, m_UseFullRange) > 0)) - ReversePolyPtLinks(outRec->pts); - } - - if (m_Joins.size() > 0) JoinCommonEdges(); - } - - ClearJoins(); - ClearHorzJoins(); - return succeeded; -} -//------------------------------------------------------------------------------ - -void Clipper::InsertScanbeam(const long64 Y) -{ - if( !m_Scanbeam ) - { - m_Scanbeam = new Scanbeam; - m_Scanbeam->next = 0; - m_Scanbeam->Y = Y; - } - else if( Y > m_Scanbeam->Y ) - { - Scanbeam* newSb = new Scanbeam; - newSb->Y = Y; - newSb->next = m_Scanbeam; - m_Scanbeam = newSb; - } else - { - Scanbeam* sb2 = m_Scanbeam; - while( sb2->next && ( Y <= sb2->next->Y ) ) sb2 = sb2->next; - if( Y == sb2->Y ) return; //ie ignores duplicates - Scanbeam* newSb = new Scanbeam; - newSb->Y = Y; - newSb->next = sb2->next; - sb2->next = newSb; - } -} -//------------------------------------------------------------------------------ - -long64 Clipper::PopScanbeam() -{ - long64 Y = m_Scanbeam->Y; - Scanbeam* sb2 = m_Scanbeam; - m_Scanbeam = m_Scanbeam->next; - delete sb2; - return Y; -} -//------------------------------------------------------------------------------ - -void Clipper::DisposeAllPolyPts(){ - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - DisposeOutRec(i); - m_PolyOuts.clear(); -} -//------------------------------------------------------------------------------ - -void Clipper::DisposeOutRec(PolyOutList::size_type index) -{ - OutRec *outRec = m_PolyOuts[index]; - if (outRec->pts) DisposeOutPts(outRec->pts); - delete outRec; - m_PolyOuts[index] = 0; -} -//------------------------------------------------------------------------------ - -void Clipper::SetWindingCount(TEdge &edge) -{ - TEdge *e = edge.prevInAEL; - //find the edge of the same polytype that immediately preceeds 'edge' in AEL - while ( e && e->polyType != edge.polyType ) e = e->prevInAEL; - if ( !e ) - { - edge.windCnt = edge.windDelta; - edge.windCnt2 = 0; - e = m_ActiveEdges; //ie get ready to calc windCnt2 - } else if ( IsEvenOddFillType(edge) ) - { - //EvenOdd filling ... - edge.windCnt = 1; - edge.windCnt2 = e->windCnt2; - e = e->nextInAEL; //ie get ready to calc windCnt2 - } else - { - //nonZero, Positive or Negative filling ... - if ( e->windCnt * e->windDelta < 0 ) - { - if (Abs(e->windCnt) > 1) - { - if (e->windDelta * edge.windDelta < 0) edge.windCnt = e->windCnt; - else edge.windCnt = e->windCnt + edge.windDelta; - } else - edge.windCnt = e->windCnt + e->windDelta + edge.windDelta; - } else - { - if ( Abs(e->windCnt) > 1 && e->windDelta * edge.windDelta < 0) - edge.windCnt = e->windCnt; - else if ( e->windCnt + edge.windDelta == 0 ) - edge.windCnt = e->windCnt; - else edge.windCnt = e->windCnt + edge.windDelta; - } - edge.windCnt2 = e->windCnt2; - e = e->nextInAEL; //ie get ready to calc windCnt2 - } - - //update windCnt2 ... - if ( IsEvenOddAltFillType(edge) ) - { - //EvenOdd filling ... - while ( e != &edge ) - { - edge.windCnt2 = (edge.windCnt2 == 0) ? 1 : 0; - e = e->nextInAEL; - } - } else - { - //nonZero, Positive or Negative filling ... - while ( e != &edge ) - { - edge.windCnt2 += e->windDelta; - e = e->nextInAEL; - } - } -} -//------------------------------------------------------------------------------ - -bool Clipper::IsEvenOddFillType(const TEdge& edge) const -{ - if (edge.polyType == ptSubject) - return m_SubjFillType == pftEvenOdd; else - return m_ClipFillType == pftEvenOdd; -} -//------------------------------------------------------------------------------ - -bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const -{ - if (edge.polyType == ptSubject) - return m_ClipFillType == pftEvenOdd; else - return m_SubjFillType == pftEvenOdd; -} -//------------------------------------------------------------------------------ - -bool Clipper::IsContributing(const TEdge& edge) const -{ - PolyFillType pft, pft2; - if (edge.polyType == ptSubject) - { - pft = m_SubjFillType; - pft2 = m_ClipFillType; - } else - { - pft = m_ClipFillType; - pft2 = m_SubjFillType; - } - - switch(pft) - { - case pftEvenOdd: - case pftNonZero: - if (Abs(edge.windCnt) != 1) return false; - break; - case pftPositive: - if (edge.windCnt != 1) return false; - break; - default: //pftNegative - if (edge.windCnt != -1) return false; - } - - switch(m_ClipType) - { - case ctIntersection: - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.windCnt2 != 0); - case pftPositive: - return (edge.windCnt2 > 0); - default: - return (edge.windCnt2 < 0); - } - case ctUnion: - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.windCnt2 == 0); - case pftPositive: - return (edge.windCnt2 <= 0); - default: - return (edge.windCnt2 >= 0); - } - case ctDifference: - if (edge.polyType == ptSubject) - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.windCnt2 == 0); - case pftPositive: - return (edge.windCnt2 <= 0); - default: - return (edge.windCnt2 >= 0); - } - else - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.windCnt2 != 0); - case pftPositive: - return (edge.windCnt2 > 0); - default: - return (edge.windCnt2 < 0); - } - default: - return true; - } -} -//------------------------------------------------------------------------------ - -void Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt) -{ - TEdge *e, *prevE; - if( NEAR_EQUAL(e2->dx, HORIZONTAL) || ( e1->dx > e2->dx ) ) - { - AddOutPt( e1, pt ); - e2->outIdx = e1->outIdx; - e1->side = esLeft; - e2->side = esRight; - e = e1; - if (e->prevInAEL == e2) - prevE = e2->prevInAEL; - else - prevE = e->prevInAEL; - } else - { - AddOutPt( e2, pt ); - e1->outIdx = e2->outIdx; - e1->side = esRight; - e2->side = esLeft; - e = e2; - if (e->prevInAEL == e1) - prevE = e1->prevInAEL; - else - prevE = e->prevInAEL; - } - if (prevE && prevE->outIdx >= 0 && - (TopX(*prevE, pt.Y) == TopX(*e, pt.Y)) && - SlopesEqual(*e, *prevE, m_UseFullRange)) - AddJoin(e, prevE, -1, -1); -} -//------------------------------------------------------------------------------ - -void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt) -{ - AddOutPt( e1, pt ); - if( e1->outIdx == e2->outIdx ) - { - e1->outIdx = -1; - e2->outIdx = -1; - } - else if (e1->outIdx < e2->outIdx) - AppendPolygon(e1, e2); - else - AppendPolygon(e2, e1); -} -//------------------------------------------------------------------------------ - -void Clipper::AddEdgeToSEL(TEdge *edge) -{ - //SEL pointers in PEdge are reused to build a list of horizontal edges. - //However, we don't need to worry about order with horizontal edge processing. - if( !m_SortedEdges ) - { - m_SortedEdges = edge; - edge->prevInSEL = 0; - edge->nextInSEL = 0; - } - else - { - edge->nextInSEL = m_SortedEdges; - edge->prevInSEL = 0; - m_SortedEdges->prevInSEL = edge; - m_SortedEdges = edge; - } -} -//------------------------------------------------------------------------------ - -void Clipper::CopyAELToSEL() -{ - TEdge* e = m_ActiveEdges; - m_SortedEdges = e; - while ( e ) - { - e->prevInSEL = e->prevInAEL; - e->nextInSEL = e->nextInAEL; - e = e->nextInAEL; - } -} -//------------------------------------------------------------------------------ - -void Clipper::AddJoin(TEdge *e1, TEdge *e2, int e1OutIdx, int e2OutIdx) -{ - JoinRec* jr = new JoinRec; - if (e1OutIdx >= 0) - jr->poly1Idx = e1OutIdx; else - jr->poly1Idx = e1->outIdx; - jr->pt1a = IntPoint(e1->xcurr, e1->ycurr); - jr->pt1b = IntPoint(e1->xtop, e1->ytop); - if (e2OutIdx >= 0) - jr->poly2Idx = e2OutIdx; else - jr->poly2Idx = e2->outIdx; - jr->pt2a = IntPoint(e2->xcurr, e2->ycurr); - jr->pt2b = IntPoint(e2->xtop, e2->ytop); - m_Joins.push_back(jr); -} -//------------------------------------------------------------------------------ - -void Clipper::ClearJoins() -{ - for (JoinList::size_type i = 0; i < m_Joins.size(); i++) - delete m_Joins[i]; - m_Joins.resize(0); -} -//------------------------------------------------------------------------------ - -void Clipper::AddHorzJoin(TEdge *e, int idx) -{ - HorzJoinRec* hj = new HorzJoinRec; - hj->edge = e; - hj->savedIdx = idx; - m_HorizJoins.push_back(hj); -} -//------------------------------------------------------------------------------ - -void Clipper::ClearHorzJoins() -{ - for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); i++) - delete m_HorizJoins[i]; - m_HorizJoins.resize(0); -} -//------------------------------------------------------------------------------ - -void Clipper::InsertLocalMinimaIntoAEL(const long64 botY) -{ - while( m_CurrentLM && ( m_CurrentLM->Y == botY ) ) - { - TEdge* lb = m_CurrentLM->leftBound; - TEdge* rb = m_CurrentLM->rightBound; - - InsertEdgeIntoAEL( lb ); - InsertScanbeam( lb->ytop ); - InsertEdgeIntoAEL( rb ); - - if (IsEvenOddFillType(*lb)) - { - lb->windDelta = 1; - rb->windDelta = 1; - } - else - { - rb->windDelta = -lb->windDelta; - } - SetWindingCount( *lb ); - rb->windCnt = lb->windCnt; - rb->windCnt2 = lb->windCnt2; - - if( NEAR_EQUAL(rb->dx, HORIZONTAL) ) - { - //nb: only rightbounds can have a horizontal bottom edge - AddEdgeToSEL( rb ); - InsertScanbeam( rb->nextInLML->ytop ); - } - else - InsertScanbeam( rb->ytop ); - - if( IsContributing(*lb) ) - AddLocalMinPoly( lb, rb, IntPoint(lb->xcurr, m_CurrentLM->Y) ); - - //if any output polygons share an edge, they'll need joining later ... - if (rb->outIdx >= 0 && NEAR_EQUAL(rb->dx, HORIZONTAL)) - { - for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); ++i) - { - IntPoint pt, pt2; //returned by GetOverlapSegment() but unused here. - HorzJoinRec* hj = m_HorizJoins[i]; - //if horizontals rb and hj.edge overlap, flag for joining later ... - if (GetOverlapSegment(IntPoint(hj->edge->xbot, hj->edge->ybot), - IntPoint(hj->edge->xtop, hj->edge->ytop), - IntPoint(rb->xbot, rb->ybot), - IntPoint(rb->xtop, rb->ytop), pt, pt2)) - AddJoin(hj->edge, rb, hj->savedIdx); - } - } - - if( lb->nextInAEL != rb ) - { - if (rb->outIdx >= 0 && rb->prevInAEL->outIdx >= 0 && - SlopesEqual(*rb->prevInAEL, *rb, m_UseFullRange)) - AddJoin(rb, rb->prevInAEL); - - TEdge* e = lb->nextInAEL; - IntPoint pt = IntPoint(lb->xcurr, lb->ycurr); - while( e != rb ) - { - if(!e) throw clipperException("InsertLocalMinimaIntoAEL: missing rightbound!"); - //nb: For calculating winding counts etc, IntersectEdges() assumes - //that param1 will be to the right of param2 ABOVE the intersection ... - IntersectEdges( rb , e , pt , ipNone); //order important here - e = e->nextInAEL; - } - } - PopLocalMinima(); - } -} -//------------------------------------------------------------------------------ - -void Clipper::DeleteFromAEL(TEdge *e) -{ - TEdge* AelPrev = e->prevInAEL; - TEdge* AelNext = e->nextInAEL; - if( !AelPrev && !AelNext && (e != m_ActiveEdges) ) return; //already deleted - if( AelPrev ) AelPrev->nextInAEL = AelNext; - else m_ActiveEdges = AelNext; - if( AelNext ) AelNext->prevInAEL = AelPrev; - e->nextInAEL = 0; - e->prevInAEL = 0; -} -//------------------------------------------------------------------------------ - -void Clipper::DeleteFromSEL(TEdge *e) -{ - TEdge* SelPrev = e->prevInSEL; - TEdge* SelNext = e->nextInSEL; - if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted - if( SelPrev ) SelPrev->nextInSEL = SelNext; - else m_SortedEdges = SelNext; - if( SelNext ) SelNext->prevInSEL = SelPrev; - e->nextInSEL = 0; - e->prevInSEL = 0; -} -//------------------------------------------------------------------------------ - -void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, - const IntPoint &pt, const IntersectProtects protects) -{ - //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 = !(ipLeft & protects) && !e1->nextInLML && - e1->xtop == pt.X && e1->ytop == pt.Y; - bool e2stops = !(ipRight & protects) && !e2->nextInLML && - e2->xtop == pt.X && e2->ytop == pt.Y; - bool e1Contributing = ( e1->outIdx >= 0 ); - bool e2contributing = ( e2->outIdx >= 0 ); - - //update winding counts... - //assumes that e1 will be to the right of e2 ABOVE the intersection - if ( e1->polyType == e2->polyType ) - { - if ( IsEvenOddFillType( *e1) ) - { - int oldE1WindCnt = e1->windCnt; - e1->windCnt = e2->windCnt; - e2->windCnt = oldE1WindCnt; - } else - { - if (e1->windCnt + e2->windDelta == 0 ) e1->windCnt = -e1->windCnt; - else e1->windCnt += e2->windDelta; - if ( e2->windCnt - e1->windDelta == 0 ) e2->windCnt = -e2->windCnt; - else e2->windCnt -= e1->windDelta; - } - } else - { - if (!IsEvenOddFillType(*e2)) e1->windCnt2 += e2->windDelta; - else e1->windCnt2 = ( e1->windCnt2 == 0 ) ? 1 : 0; - if (!IsEvenOddFillType(*e1)) e2->windCnt2 -= e1->windDelta; - else e2->windCnt2 = ( e2->windCnt2 == 0 ) ? 1 : 0; - } - - PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; - if (e1->polyType == ptSubject) - { - e1FillType = m_SubjFillType; - e1FillType2 = m_ClipFillType; - } else - { - e1FillType = m_ClipFillType; - e1FillType2 = m_SubjFillType; - } - if (e2->polyType == ptSubject) - { - e2FillType = m_SubjFillType; - e2FillType2 = m_ClipFillType; - } else - { - e2FillType = m_ClipFillType; - e2FillType2 = m_SubjFillType; - } - - long64 e1Wc, e2Wc; - switch (e1FillType) - { - case pftPositive: e1Wc = e1->windCnt; break; - case pftNegative: e1Wc = -e1->windCnt; break; - default: e1Wc = Abs(e1->windCnt); - } - switch(e2FillType) - { - case pftPositive: e2Wc = e2->windCnt; break; - case pftNegative: e2Wc = -e2->windCnt; break; - default: e2Wc = Abs(e2->windCnt); - } - - if ( e1Contributing && e2contributing ) - { - if ( e1stops || e2stops || - (e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || - (e1->polyType != e2->polyType && m_ClipType != ctXor) ) - AddLocalMaxPoly(e1, e2, pt); - else - DoBothEdges( e1, e2, pt ); - } - else if ( e1Contributing ) - { - if ((e2Wc == 0 || e2Wc == 1) && - (m_ClipType != ctIntersection || - e2->polyType == ptSubject || (e2->windCnt2 != 0))) - DoEdge1(e1, e2, pt); - } - else if ( e2contributing ) - { - if ((e1Wc == 0 || e1Wc == 1) && - (m_ClipType != ctIntersection || - e1->polyType == ptSubject || (e1->windCnt2 != 0))) - DoEdge2(e1, e2, pt); - } - else if ( (e1Wc == 0 || e1Wc == 1) && - (e2Wc == 0 || e2Wc == 1) && !e1stops && !e2stops ) - { - //neither edge is currently contributing ... - - long64 e1Wc2, e2Wc2; - switch (e1FillType2) - { - case pftPositive: e1Wc2 = e1->windCnt2; break; - case pftNegative : e1Wc2 = -e1->windCnt2; break; - default: e1Wc2 = Abs(e1->windCnt2); - } - switch (e2FillType2) - { - case pftPositive: e2Wc2 = e2->windCnt2; break; - case pftNegative: e2Wc2 = -e2->windCnt2; break; - default: e2Wc2 = Abs(e2->windCnt2); - } - - if (e1->polyType != e2->polyType) - AddLocalMinPoly(e1, e2, pt); - else if (e1Wc == 1 && e2Wc == 1) - switch( m_ClipType ) { - case ctIntersection: - if (e1Wc2 > 0 && e2Wc2 > 0) - AddLocalMinPoly(e1, e2, pt); - break; - case ctUnion: - if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) - AddLocalMinPoly(e1, e2, pt); - break; - case ctDifference: - if (((e1->polyType == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || - ((e1->polyType == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) - AddLocalMinPoly(e1, e2, pt); - break; - case ctXor: - AddLocalMinPoly(e1, e2, pt); - } - 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 ); -} -//------------------------------------------------------------------------------ - -void Clipper::SetHoleState(TEdge *e, OutRec *outRec) -{ - bool isHole = false; - TEdge *e2 = e->prevInAEL; - while (e2) - { - if (e2->outIdx >= 0) - { - isHole = !isHole; - if (! outRec->FirstLeft) - outRec->FirstLeft = m_PolyOuts[e2->outIdx]; - } - e2 = e2->prevInAEL; - } - if (isHole) outRec->isHole = true; -} -//------------------------------------------------------------------------------ - -OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) -{ - //work out which polygon fragment has the correct hole state ... - 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; - else if (outPt1->next == outPt1) return outRec2; - else if (outPt2->next == outPt2) return outRec1; - else if (FirstIsBottomPt(outPt1, outPt2)) return outRec1; - else return outRec2; -} -//------------------------------------------------------------------------------ - -bool Param1RightOfParam2(OutRec* outRec1, OutRec* outRec2) -{ - do - { - outRec1 = outRec1->FirstLeft; - if (outRec1 == outRec2) return true; - } while (outRec1); - return false; -} -//------------------------------------------------------------------------------ - -void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) -{ - //get the start and ends of both output polygons ... - OutRec *outRec1 = m_PolyOuts[e1->outIdx]; - OutRec *outRec2 = m_PolyOuts[e2->outIdx]; - - OutRec *holeStateRec; - if (Param1RightOfParam2(outRec1, outRec2)) - holeStateRec = outRec2; - else if (Param1RightOfParam2(outRec2, outRec1)) - holeStateRec = outRec1; - else - holeStateRec = GetLowermostRec(outRec1, outRec2); - - OutPt* p1_lft = outRec1->pts; - OutPt* p1_rt = p1_lft->prev; - OutPt* p2_lft = outRec2->pts; - OutPt* p2_rt = p2_lft->prev; - - EdgeSide side; - //join e2 poly onto e1 poly and delete pointers to e2 ... - if( e1->side == esLeft ) - { - if( e2->side == esLeft ) - { - //z y x a b c - ReversePolyPtLinks(p2_lft); - p2_lft->next = p1_lft; - p1_lft->prev = p2_lft; - p1_rt->next = p2_rt; - p2_rt->prev = p1_rt; - outRec1->pts = p2_rt; - } else - { - //x y z a b c - p2_rt->next = p1_lft; - p1_lft->prev = p2_rt; - p2_lft->prev = p1_rt; - p1_rt->next = p2_lft; - outRec1->pts = p2_lft; - } - side = esLeft; - } else - { - if( e2->side == esRight ) - { - //a b c z y x - ReversePolyPtLinks(p2_lft); - p1_rt->next = p2_rt; - p2_rt->prev = p1_rt; - p2_lft->next = p1_lft; - p1_lft->prev = p2_lft; - } else - { - //a b c x y z - p1_rt->next = p2_lft; - p2_lft->prev = p1_rt; - p1_lft->prev = p2_rt; - p2_rt->next = p1_lft; - } - side = esRight; - } - - if (holeStateRec == outRec2) - { - outRec1->bottomPt = outRec2->bottomPt; - outRec1->bottomPt->idx = outRec1->idx; - if (outRec2->FirstLeft != outRec1) - outRec1->FirstLeft = outRec2->FirstLeft; - outRec1->isHole = outRec2->isHole; - } - outRec2->pts = 0; - outRec2->bottomPt = 0; - - outRec2->FirstLeft = outRec1; - - int OKIdx = e1->outIdx; - int ObsoleteIdx = e2->outIdx; - - e1->outIdx = -1; //nb: safe because we only get here via AddLocalMaxPoly - e2->outIdx = -1; - - TEdge* e = m_ActiveEdges; - while( e ) - { - if( e->outIdx == ObsoleteIdx ) - { - e->outIdx = OKIdx; - e->side = side; - break; - } - e = e->nextInAEL; - } - - for (JoinList::size_type i = 0; i < m_Joins.size(); ++i) - { - if (m_Joins[i]->poly1Idx == ObsoleteIdx) m_Joins[i]->poly1Idx = OKIdx; - if (m_Joins[i]->poly2Idx == ObsoleteIdx) m_Joins[i]->poly2Idx = OKIdx; - } - - for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); ++i) - { - if (m_HorizJoins[i]->savedIdx == ObsoleteIdx) - m_HorizJoins[i]->savedIdx = OKIdx; - } - -} -//------------------------------------------------------------------------------ - -OutRec* Clipper::CreateOutRec() -{ - OutRec* result = new OutRec; - result->isHole = false; - result->FirstLeft = 0; - result->pts = 0; - result->bottomPt = 0; - result->polyNode = 0; - return result; -} -//------------------------------------------------------------------------------ - -void Clipper::AddOutPt(TEdge *e, const IntPoint &pt) -{ - bool ToFront = (e->side == esLeft); - if( e->outIdx < 0 ) - { - OutRec *outRec = CreateOutRec(); - m_PolyOuts.push_back(outRec); - outRec->idx = (int)m_PolyOuts.size()-1; - e->outIdx = outRec->idx; - OutPt* op = new OutPt; - outRec->pts = op; - outRec->bottomPt = op; - op->pt = pt; - op->idx = outRec->idx; - op->next = op; - op->prev = op; - SetHoleState(e, outRec); - } else - { - OutRec *outRec = m_PolyOuts[e->outIdx]; - OutPt* op = outRec->pts; - if ((ToFront && PointsEqual(pt, op->pt)) || - (!ToFront && PointsEqual(pt, op->prev->pt))) return; - - OutPt* op2 = new OutPt; - op2->pt = pt; - op2->idx = outRec->idx; - if (op2->pt.Y == outRec->bottomPt->pt.Y && - op2->pt.X < outRec->bottomPt->pt.X) - outRec->bottomPt = op2; - op2->next = op; - op2->prev = op->prev; - op2->prev->next = op2; - op->prev = op2; - if (ToFront) outRec->pts = op2; - } -} -//------------------------------------------------------------------------------ - -void Clipper::ProcessHorizontals() -{ - TEdge* horzEdge = m_SortedEdges; - while( horzEdge ) - { - DeleteFromSEL( horzEdge ); - ProcessHorizontal( horzEdge ); - horzEdge = m_SortedEdges; - } -} -//------------------------------------------------------------------------------ - -bool Clipper::IsTopHorz(const long64 XPos) -{ - TEdge* e = m_SortedEdges; - while( e ) - { - if( ( XPos >= std::min(e->xcurr, e->xtop) ) && - ( XPos <= std::max(e->xcurr, e->xtop) ) ) return false; - e = e->nextInSEL; - } - return true; -} -//------------------------------------------------------------------------------ - -bool IsMinima(TEdge *e) -{ - return e && (e->prev->nextInLML != e) && (e->next->nextInLML != e); -} -//------------------------------------------------------------------------------ - -bool IsMaxima(TEdge *e, const long64 Y) -{ - return e && e->ytop == Y && !e->nextInLML; -} -//------------------------------------------------------------------------------ - -bool IsIntermediate(TEdge *e, const long64 Y) -{ - return e->ytop == Y && e->nextInLML; -} -//------------------------------------------------------------------------------ - -TEdge *GetMaximaPair(TEdge *e) -{ - if( !IsMaxima(e->next, e->ytop) || e->next->xtop != e->xtop ) - return e->prev; else - return e->next; -} -//------------------------------------------------------------------------------ - -void Clipper::SwapPositionsInAEL(TEdge *edge1, TEdge *edge2) -{ - if( edge1->nextInAEL == edge2 ) - { - TEdge* next = edge2->nextInAEL; - if( next ) next->prevInAEL = edge1; - TEdge* prev = edge1->prevInAEL; - if( prev ) prev->nextInAEL = edge2; - edge2->prevInAEL = prev; - edge2->nextInAEL = edge1; - edge1->prevInAEL = edge2; - edge1->nextInAEL = next; - } - else if( edge2->nextInAEL == edge1 ) - { - TEdge* next = edge1->nextInAEL; - if( next ) next->prevInAEL = edge2; - TEdge* prev = edge2->prevInAEL; - if( prev ) prev->nextInAEL = edge1; - edge1->prevInAEL = prev; - edge1->nextInAEL = edge2; - edge2->prevInAEL = edge1; - edge2->nextInAEL = next; - } - else - { - TEdge* next = edge1->nextInAEL; - TEdge* prev = edge1->prevInAEL; - edge1->nextInAEL = edge2->nextInAEL; - if( edge1->nextInAEL ) edge1->nextInAEL->prevInAEL = edge1; - edge1->prevInAEL = edge2->prevInAEL; - if( edge1->prevInAEL ) edge1->prevInAEL->nextInAEL = edge1; - edge2->nextInAEL = next; - if( edge2->nextInAEL ) edge2->nextInAEL->prevInAEL = edge2; - edge2->prevInAEL = prev; - if( edge2->prevInAEL ) edge2->prevInAEL->nextInAEL = edge2; - } - - if( !edge1->prevInAEL ) m_ActiveEdges = edge1; - else if( !edge2->prevInAEL ) m_ActiveEdges = edge2; -} -//------------------------------------------------------------------------------ - -void Clipper::SwapPositionsInSEL(TEdge *edge1, TEdge *edge2) -{ - if( !( edge1->nextInSEL ) && !( edge1->prevInSEL ) ) return; - if( !( edge2->nextInSEL ) && !( edge2->prevInSEL ) ) return; - - if( edge1->nextInSEL == edge2 ) - { - TEdge* next = edge2->nextInSEL; - if( next ) next->prevInSEL = edge1; - TEdge* prev = edge1->prevInSEL; - if( prev ) prev->nextInSEL = edge2; - edge2->prevInSEL = prev; - edge2->nextInSEL = edge1; - edge1->prevInSEL = edge2; - edge1->nextInSEL = next; - } - else if( edge2->nextInSEL == edge1 ) - { - TEdge* next = edge1->nextInSEL; - if( next ) next->prevInSEL = edge2; - TEdge* prev = edge2->prevInSEL; - if( prev ) prev->nextInSEL = edge1; - edge1->prevInSEL = prev; - edge1->nextInSEL = edge2; - edge2->prevInSEL = edge1; - edge2->nextInSEL = next; - } - else - { - TEdge* next = edge1->nextInSEL; - TEdge* prev = edge1->prevInSEL; - edge1->nextInSEL = edge2->nextInSEL; - if( edge1->nextInSEL ) edge1->nextInSEL->prevInSEL = edge1; - edge1->prevInSEL = edge2->prevInSEL; - if( edge1->prevInSEL ) edge1->prevInSEL->nextInSEL = edge1; - edge2->nextInSEL = next; - if( edge2->nextInSEL ) edge2->nextInSEL->prevInSEL = edge2; - edge2->prevInSEL = prev; - if( edge2->prevInSEL ) edge2->prevInSEL->nextInSEL = edge2; - } - - if( !edge1->prevInSEL ) m_SortedEdges = edge1; - else if( !edge2->prevInSEL ) m_SortedEdges = edge2; -} -//------------------------------------------------------------------------------ - -TEdge* GetNextInAEL(TEdge *e, Direction dir) -{ - return dir == dLeftToRight ? e->nextInAEL : e->prevInAEL; -} -//------------------------------------------------------------------------------ - -void Clipper::ProcessHorizontal(TEdge *horzEdge) -{ - Direction dir; - long64 horzLeft, horzRight; - - if( horzEdge->xcurr < horzEdge->xtop ) - { - horzLeft = horzEdge->xcurr; - horzRight = horzEdge->xtop; - dir = dLeftToRight; - } else - { - horzLeft = horzEdge->xtop; - horzRight = horzEdge->xcurr; - dir = dRightToLeft; - } - - TEdge* eMaxPair; - if( horzEdge->nextInLML ) eMaxPair = 0; - else eMaxPair = GetMaximaPair(horzEdge); - - TEdge* e = GetNextInAEL( horzEdge , dir ); - while( e ) - { - TEdge* eNext = GetNextInAEL( e, dir ); - - if (eMaxPair || - ((dir == dLeftToRight) && (e->xcurr <= horzRight)) || - ((dir == dRightToLeft) && (e->xcurr >= horzLeft))) - { - //ok, so far it looks like we're still in range of the horizontal edge - if ( e->xcurr == horzEdge->xtop && !eMaxPair ) - { - if (SlopesEqual(*e, *horzEdge->nextInLML, m_UseFullRange)) - { - //if output polygons share an edge, they'll need joining later ... - if (horzEdge->outIdx >= 0 && e->outIdx >= 0) - AddJoin(horzEdge->nextInLML, e, horzEdge->outIdx); - break; //we've reached the end of the horizontal line - } - else if (e->dx < horzEdge->nextInLML->dx) - //we really have got to the end of the intermediate horz edge so quit. - //nb: More -ve slopes follow more +ve slopes ABOVE the horizontal. - break; - } - - if( e == eMaxPair ) - { - //horzEdge is evidently a maxima horizontal and we've arrived at its end. - if (dir == dLeftToRight) - IntersectEdges(horzEdge, e, IntPoint(e->xcurr, horzEdge->ycurr), ipNone); - else - IntersectEdges(e, horzEdge, IntPoint(e->xcurr, horzEdge->ycurr), ipNone); - if (eMaxPair->outIdx >= 0) throw clipperException("ProcessHorizontal error"); - return; - } - else if( NEAR_EQUAL(e->dx, HORIZONTAL) && !IsMinima(e) && !(e->xcurr > e->xtop) ) - { - //An overlapping horizontal edge. Overlapping horizontal edges are - //processed as if layered with the current horizontal edge (horizEdge) - //being infinitesimally lower that the next (e). Therfore, we - //intersect with e only if e.xcurr is within the bounds of horzEdge ... - if( dir == dLeftToRight ) - IntersectEdges( horzEdge , e, IntPoint(e->xcurr, horzEdge->ycurr), - (IsTopHorz( e->xcurr ))? ipLeft : ipBoth ); - else - IntersectEdges( e, horzEdge, IntPoint(e->xcurr, horzEdge->ycurr), - (IsTopHorz( e->xcurr ))? ipRight : ipBoth ); - } - else if( dir == dLeftToRight ) - { - IntersectEdges( horzEdge, e, IntPoint(e->xcurr, horzEdge->ycurr), - (IsTopHorz( e->xcurr ))? ipLeft : ipBoth ); - } - else - { - IntersectEdges( e, horzEdge, IntPoint(e->xcurr, horzEdge->ycurr), - (IsTopHorz( e->xcurr ))? ipRight : ipBoth ); - } - SwapPositionsInAEL( horzEdge, e ); - } - else if( (dir == dLeftToRight && e->xcurr > horzRight && m_SortedEdges) || - (dir == dRightToLeft && e->xcurr < horzLeft && m_SortedEdges) ) break; - e = eNext; - } //end while - - if( horzEdge->nextInLML ) - { - if( horzEdge->outIdx >= 0 ) - AddOutPt( horzEdge, IntPoint(horzEdge->xtop, horzEdge->ytop)); - UpdateEdgeIntoAEL( horzEdge ); - } - else - { - if ( horzEdge->outIdx >= 0 ) - IntersectEdges( horzEdge, eMaxPair, - IntPoint(horzEdge->xtop, horzEdge->ycurr), ipBoth); - if (eMaxPair->outIdx >= 0) throw clipperException("ProcessHorizontal error"); - DeleteFromAEL(eMaxPair); - DeleteFromAEL(horzEdge); - } -} -//------------------------------------------------------------------------------ - -void Clipper::UpdateEdgeIntoAEL(TEdge *&e) -{ - if( !e->nextInLML ) throw - clipperException("UpdateEdgeIntoAEL: invalid call"); - TEdge* AelPrev = e->prevInAEL; - TEdge* AelNext = e->nextInAEL; - e->nextInLML->outIdx = e->outIdx; - if( AelPrev ) AelPrev->nextInAEL = e->nextInLML; - else m_ActiveEdges = e->nextInLML; - if( AelNext ) AelNext->prevInAEL = e->nextInLML; - e->nextInLML->side = e->side; - e->nextInLML->windDelta = e->windDelta; - e->nextInLML->windCnt = e->windCnt; - e->nextInLML->windCnt2 = e->windCnt2; - e = e->nextInLML; - e->prevInAEL = AelPrev; - e->nextInAEL = AelNext; - if( !NEAR_EQUAL(e->dx, HORIZONTAL) ) InsertScanbeam( e->ytop ); -} -//------------------------------------------------------------------------------ - -bool Clipper::ProcessIntersections(const long64 botY, const long64 topY) -{ - if( !m_ActiveEdges ) return true; - try { - BuildIntersectList(botY, topY); - if ( !m_IntersectNodes) return true; - if ( FixupIntersections() ) ProcessIntersectList(); - else return false; - } - catch(...) { - m_SortedEdges = 0; - DisposeIntersectNodes(); - throw clipperException("ProcessIntersections error"); - } - return true; -} -//------------------------------------------------------------------------------ - -void Clipper::DisposeIntersectNodes() -{ - while ( m_IntersectNodes ) - { - IntersectNode* iNode = m_IntersectNodes->next; - delete m_IntersectNodes; - m_IntersectNodes = iNode; - } -} -//------------------------------------------------------------------------------ - -void Clipper::BuildIntersectList(const long64 botY, const long64 topY) -{ - if ( !m_ActiveEdges ) return; - - //prepare for sorting ... - TEdge* e = m_ActiveEdges; - m_SortedEdges = e; - while( e ) - { - e->prevInSEL = e->prevInAEL; - e->nextInSEL = e->nextInAEL; - e->tmpX = TopX( *e, topY ); - e = e->nextInAEL; - } - - //bubblesort ... - bool isModified = true; - while( isModified && m_SortedEdges ) - { - isModified = false; - e = m_SortedEdges; - while( e->nextInSEL ) - { - TEdge *eNext = e->nextInSEL; - IntPoint pt; - if(e->tmpX > eNext->tmpX && - IntersectPoint(*e, *eNext, pt, m_UseFullRange)) - { - if (pt.Y > botY) - { - pt.Y = botY; - pt.X = TopX(*e, pt.Y); - } - AddIntersectNode( e, eNext, pt ); - SwapPositionsInSEL(e, eNext); - isModified = true; - } - else - e = eNext; - } - if( e->prevInSEL ) e->prevInSEL->nextInSEL = 0; - else break; - } - m_SortedEdges = 0; -} -//------------------------------------------------------------------------------ - -bool ProcessParam1BeforeParam2(const IntersectNode &node1, const IntersectNode &node2) -{ - bool result; - if (node1.pt.Y == node2.pt.Y) - { - if (node1.edge1 == node2.edge1 || node1.edge2 == node2.edge1) - { - result = node2.pt.X > node1.pt.X; - return node2.edge1->dx > 0 ? !result : result; - } - else if (node1.edge1 == node2.edge2 || node1.edge2 == node2.edge2) - { - result = node2.pt.X > node1.pt.X; - return node2.edge2->dx > 0 ? !result : result; - } - else return node2.pt.X > node1.pt.X; - } - else return node1.pt.Y > node2.pt.Y; -} -//------------------------------------------------------------------------------ - -void Clipper::AddIntersectNode(TEdge *e1, TEdge *e2, const IntPoint &pt) -{ - IntersectNode* newNode = new IntersectNode; - newNode->edge1 = e1; - newNode->edge2 = e2; - newNode->pt = pt; - newNode->next = 0; - if( !m_IntersectNodes ) m_IntersectNodes = newNode; - else if( ProcessParam1BeforeParam2(*newNode, *m_IntersectNodes) ) - { - newNode->next = m_IntersectNodes; - m_IntersectNodes = newNode; - } - else - { - IntersectNode* iNode = m_IntersectNodes; - while( iNode->next && ProcessParam1BeforeParam2(*iNode->next, *newNode) ) - iNode = iNode->next; - newNode->next = iNode->next; - iNode->next = newNode; - } -} -//------------------------------------------------------------------------------ - -void Clipper::ProcessIntersectList() -{ - while( m_IntersectNodes ) - { - IntersectNode* iNode = m_IntersectNodes->next; - { - IntersectEdges( m_IntersectNodes->edge1 , - m_IntersectNodes->edge2 , m_IntersectNodes->pt, ipBoth ); - SwapPositionsInAEL( m_IntersectNodes->edge1 , m_IntersectNodes->edge2 ); - } - delete m_IntersectNodes; - m_IntersectNodes = iNode; - } -} -//------------------------------------------------------------------------------ - -void Clipper::DoMaxima(TEdge *e, long64 topY) -{ - TEdge* eMaxPair = GetMaximaPair(e); - long64 X = e->xtop; - TEdge* eNext = e->nextInAEL; - while( eNext != eMaxPair ) - { - if (!eNext) throw clipperException("DoMaxima error"); - IntersectEdges( e, eNext, IntPoint(X, topY), ipBoth ); - SwapPositionsInAEL(e, eNext); - eNext = eNext->nextInAEL; - } - if( e->outIdx < 0 && eMaxPair->outIdx < 0 ) - { - DeleteFromAEL( e ); - DeleteFromAEL( eMaxPair ); - } - else if( e->outIdx >= 0 && eMaxPair->outIdx >= 0 ) - { - IntersectEdges( e, eMaxPair, IntPoint(X, topY), ipNone ); - } - else throw clipperException("DoMaxima error"); -} -//------------------------------------------------------------------------------ - -void Clipper::ProcessEdgesAtTopOfScanbeam(const long64 topY) -{ - TEdge* e = m_ActiveEdges; - while( e ) - { - //1. process maxima, treating them as if they're 'bent' horizontal edges, - // but exclude maxima with horizontal edges. nb: e can't be a horizontal. - if( IsMaxima(e, topY) && !NEAR_EQUAL(GetMaximaPair(e)->dx, HORIZONTAL) ) - { - //'e' might be removed from AEL, as may any following edges so ... - TEdge* ePrev = e->prevInAEL; - DoMaxima(e, topY); - if( !ePrev ) e = m_ActiveEdges; - else e = ePrev->nextInAEL; - } - else - { - //2. promote horizontal edges, otherwise update xcurr and ycurr ... - if( IsIntermediate(e, topY) && NEAR_EQUAL(e->nextInLML->dx, HORIZONTAL) ) - { - if (e->outIdx >= 0) - { - AddOutPt(e, IntPoint(e->xtop, e->ytop)); - - for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); ++i) - { - IntPoint pt, pt2; - HorzJoinRec* hj = m_HorizJoins[i]; - if (GetOverlapSegment(IntPoint(hj->edge->xbot, hj->edge->ybot), - IntPoint(hj->edge->xtop, hj->edge->ytop), - IntPoint(e->nextInLML->xbot, e->nextInLML->ybot), - IntPoint(e->nextInLML->xtop, e->nextInLML->ytop), pt, pt2)) - AddJoin(hj->edge, e->nextInLML, hj->savedIdx, e->outIdx); - } - - AddHorzJoin(e->nextInLML, e->outIdx); - } - UpdateEdgeIntoAEL(e); - AddEdgeToSEL(e); - } else - { - //this just simplifies horizontal processing ... - e->xcurr = TopX( *e, topY ); - e->ycurr = topY; - } - e = e->nextInAEL; - } - } - - //3. Process horizontals at the top of the scanbeam ... - ProcessHorizontals(); - - //4. Promote intermediate vertices ... - e = m_ActiveEdges; - while( e ) - { - if( IsIntermediate( e, topY ) ) - { - if( e->outIdx >= 0 ) AddOutPt(e, IntPoint(e->xtop,e->ytop)); - UpdateEdgeIntoAEL(e); - - //if output polygons share an edge, they'll need joining later ... - TEdge* ePrev = e->prevInAEL; - TEdge* eNext = e->nextInAEL; - if (ePrev && ePrev->xcurr == e->xbot && - ePrev->ycurr == e->ybot && e->outIdx >= 0 && - ePrev->outIdx >= 0 && ePrev->ycurr > ePrev->ytop && - SlopesEqual(*e, *ePrev, m_UseFullRange)) - { - AddOutPt(ePrev, IntPoint(e->xbot, e->ybot)); - AddJoin(e, ePrev); - } - else if (eNext && eNext->xcurr == e->xbot && - eNext->ycurr == e->ybot && e->outIdx >= 0 && - eNext->outIdx >= 0 && eNext->ycurr > eNext->ytop && - SlopesEqual(*e, *eNext, m_UseFullRange)) - { - AddOutPt(eNext, IntPoint(e->xbot, e->ybot)); - AddJoin(e, eNext); - } - } - e = e->nextInAEL; - } -} -//------------------------------------------------------------------------------ - -void Clipper::FixupOutPolygon(OutRec &outRec) -{ - //FixupOutPolygon() - removes duplicate points and simplifies consecutive - //parallel edges by removing the middle vertex. - OutPt *lastOK = 0; - outRec.pts = outRec.bottomPt; - OutPt *pp = outRec.bottomPt; - - for (;;) - { - if (pp->prev == pp || pp->prev == pp->next ) - { - DisposeOutPts(pp); - outRec.pts = 0; - outRec.bottomPt = 0; - return; - } - //test for duplicate points and for same slope (cross-product) ... - if ( PointsEqual(pp->pt, pp->next->pt) || - SlopesEqual(pp->prev->pt, pp->pt, pp->next->pt, m_UseFullRange) ) - { - lastOK = 0; - OutPt *tmp = pp; - if (pp == outRec.bottomPt) - outRec.bottomPt = 0; //flags need for updating - 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 (!outRec.bottomPt) { - outRec.bottomPt = GetBottomPt(pp); - outRec.bottomPt->idx = outRec.idx; - outRec.pts = outRec.bottomPt; - } -} -//------------------------------------------------------------------------------ - -void Clipper::BuildResult(Polygons &polys) -{ - int k = 0; - polys.resize(m_PolyOuts.size()); - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - if (m_PolyOuts[i]->pts) - { - Polygon* pg = &polys[k]; - pg->clear(); - OutPt* p = m_PolyOuts[i]->pts; - do - { - pg->push_back(p->pt); - p = p->prev; - } while (p != m_PolyOuts[i]->pts); - //make sure each polygon has at least 3 vertices ... - if (pg->size() < 3) pg->clear(); else k++; - } - } - polys.resize(k); -} -//------------------------------------------------------------------------------ - -int PointCount(OutPt *pts) -{ - if (!pts) return 0; - int result = 0; - OutPt* p = pts; - do - { - result++; - p = p->next; - } - while (p != pts); - return result; -} -//------------------------------------------------------------------------------ - -void Clipper::BuildResult2(PolyTree& polytree) -{ - polytree.Clear(); - polytree.AllNodes.reserve(m_PolyOuts.size()); - //add each output polygon/contour to polytree ... - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) - { - OutRec* outRec = m_PolyOuts[i]; - int cnt = PointCount(outRec->pts); - if (cnt < 3) continue; - FixHoleLinkage(*outRec); - PolyNode* pn = new PolyNode(); - //nb: polytree takes ownership of all the PolyNodes - polytree.AllNodes.push_back(pn); - outRec->polyNode = pn; - pn->Parent = 0; - pn->Index = 0; - pn->Contour.reserve(cnt); - OutPt *op = outRec->pts; - for (int j = 0; j < cnt; j++) - { - pn->Contour.push_back(op->pt); - op = op->prev; - } - } - - //fixup PolyNode links etc ... - polytree.Childs.reserve(m_PolyOuts.size()); - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) - { - OutRec* outRec = m_PolyOuts[i]; - if (!outRec->polyNode) continue; - if (outRec->FirstLeft) - outRec->FirstLeft->polyNode->AddChild(*outRec->polyNode); - else - polytree.AddChild(*outRec->polyNode); - } -} -//------------------------------------------------------------------------------ - -void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) -{ - TEdge *e1 = int1.edge1; - TEdge *e2 = int1.edge2; - IntPoint p = int1.pt; - - int1.edge1 = int2.edge1; - int1.edge2 = int2.edge2; - int1.pt = int2.pt; - - int2.edge1 = e1; - int2.edge2 = e2; - int2.pt = p; -} -//------------------------------------------------------------------------------ - -bool Clipper::FixupIntersections() -{ - if ( !m_IntersectNodes->next ) return true; - - CopyAELToSEL(); - IntersectNode *int1 = m_IntersectNodes; - IntersectNode *int2 = m_IntersectNodes->next; - while (int2) - { - TEdge *e1 = int1->edge1; - TEdge *e2; - if (e1->prevInSEL == int1->edge2) e2 = e1->prevInSEL; - else if (e1->nextInSEL == int1->edge2) e2 = e1->nextInSEL; - else - { - //The current intersection is out of order, so try and swap it with - //a subsequent intersection ... - while (int2) - { - if (int2->edge1->nextInSEL == int2->edge2 || - int2->edge1->prevInSEL == int2->edge2) break; - else int2 = int2->next; - } - if ( !int2 ) return false; //oops!!! - - //found an intersect node that can be swapped ... - SwapIntersectNodes(*int1, *int2); - e1 = int1->edge1; - e2 = int1->edge2; - } - SwapPositionsInSEL(e1, e2); - int1 = int1->next; - int2 = int1->next; - } - - m_SortedEdges = 0; - - //finally, check the last intersection too ... - return (int1->edge1->prevInSEL == int1->edge2 || - int1->edge1->nextInSEL == int1->edge2); -} -//------------------------------------------------------------------------------ - -bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) -{ - return e2.xcurr == e1.xcurr ? e2.dx > e1.dx : e2.xcurr < e1.xcurr; -} -//------------------------------------------------------------------------------ - -void Clipper::InsertEdgeIntoAEL(TEdge *edge) -{ - edge->prevInAEL = 0; - edge->nextInAEL = 0; - if( !m_ActiveEdges ) - { - m_ActiveEdges = edge; - } - else if( E2InsertsBeforeE1(*m_ActiveEdges, *edge) ) - { - edge->nextInAEL = m_ActiveEdges; - m_ActiveEdges->prevInAEL = edge; - m_ActiveEdges = edge; - } else - { - TEdge* e = m_ActiveEdges; - while( e->nextInAEL && !E2InsertsBeforeE1(*e->nextInAEL , *edge) ) - e = e->nextInAEL; - edge->nextInAEL = e->nextInAEL; - if( e->nextInAEL ) e->nextInAEL->prevInAEL = edge; - edge->prevInAEL = e; - e->nextInAEL = edge; - } -} -//---------------------------------------------------------------------- - -void Clipper::DoEdge1(TEdge *edge1, TEdge *edge2, const IntPoint &pt) -{ - AddOutPt(edge1, pt); - SwapSides(*edge1, *edge2); - SwapPolyIndexes(*edge1, *edge2); -} -//---------------------------------------------------------------------- - -void Clipper::DoEdge2(TEdge *edge1, TEdge *edge2, const IntPoint &pt) -{ - AddOutPt(edge2, pt); - SwapSides(*edge1, *edge2); - SwapPolyIndexes(*edge1, *edge2); -} -//---------------------------------------------------------------------- - -void Clipper::DoBothEdges(TEdge *edge1, TEdge *edge2, const IntPoint &pt) -{ - AddOutPt(edge1, pt); - AddOutPt(edge2, pt); - SwapSides( *edge1 , *edge2 ); - SwapPolyIndexes( *edge1 , *edge2 ); -} -//---------------------------------------------------------------------- - -bool Clipper::JoinPoints(const JoinRec *j, OutPt *&p1, OutPt *&p2) -{ - OutRec *outRec1 = m_PolyOuts[j->poly1Idx]; - OutRec *outRec2 = m_PolyOuts[j->poly2Idx]; - if (!outRec1 || !outRec2) return false; - OutPt *pp1a = outRec1->pts; - OutPt *pp2a = outRec2->pts; - IntPoint pt1 = j->pt2a, pt2 = j->pt2b; - IntPoint pt3 = j->pt1a, pt4 = j->pt1b; - if (!FindSegment(pp1a, pt1, pt2)) return false; - if (outRec1 == outRec2) - { - //we're searching the same polygon for overlapping segments so - //segment 2 mustn't be the same as segment 1 ... - pp2a = pp1a->next; - if (!FindSegment(pp2a, pt3, pt4) || (pp2a == pp1a)) return false; - } - else if (!FindSegment(pp2a, pt3, pt4)) return false; - - if (!GetOverlapSegment(pt1, pt2, pt3, pt4, pt1, pt2)) return false; - - OutPt *p3, *p4, *prev = pp1a->prev; - //get p1 & p2 polypts - the overlap start & endpoints on poly1 - if (PointsEqual(pp1a->pt, pt1)) p1 = pp1a; - else if (PointsEqual(prev->pt, pt1)) p1 = prev; - else p1 = InsertPolyPtBetween(pp1a, prev, pt1); - - if (PointsEqual(pp1a->pt, pt2)) p2 = pp1a; - else if (PointsEqual(prev->pt, pt2)) p2 = prev; - else if ((p1 == pp1a) || (p1 == prev)) - p2 = InsertPolyPtBetween(pp1a, prev, pt2); - else if (Pt3IsBetweenPt1AndPt2(pp1a->pt, p1->pt, pt2)) - p2 = InsertPolyPtBetween(pp1a, p1, pt2); else - p2 = InsertPolyPtBetween(p1, prev, pt2); - - //get p3 & p4 polypts - the overlap start & endpoints on poly2 - prev = pp2a->prev; - if (PointsEqual(pp2a->pt, pt1)) p3 = pp2a; - else if (PointsEqual(prev->pt, pt1)) p3 = prev; - else p3 = InsertPolyPtBetween(pp2a, prev, pt1); - - if (PointsEqual(pp2a->pt, pt2)) p4 = pp2a; - else if (PointsEqual(prev->pt, pt2)) p4 = prev; - else if ((p3 == pp2a) || (p3 == prev)) - p4 = InsertPolyPtBetween(pp2a, prev, pt2); - else if (Pt3IsBetweenPt1AndPt2(pp2a->pt, p3->pt, pt2)) - p4 = InsertPolyPtBetween(pp2a, p3, pt2); else - p4 = InsertPolyPtBetween(p3, prev, pt2); - - //p1.pt == p3.pt and p2.pt == p4.pt so join p1 to p3 and p2 to p4 ... - if (p1->next == p2 && p3->prev == p4) - { - p1->next = p3; - p3->prev = p1; - p2->prev = p4; - p4->next = p2; - return true; - } - else if (p1->prev == p2 && p3->next == p4) - { - p1->prev = p3; - p3->next = p1; - p2->next = p4; - p4->prev = p2; - return true; - } - else - return false; //an orientation is probably wrong -} -//---------------------------------------------------------------------- - -void Clipper::FixupJoinRecs(JoinRec *j, OutPt *pt, unsigned startIdx) -{ - for (JoinList::size_type k = startIdx; k < m_Joins.size(); k++) - { - JoinRec* j2 = m_Joins[k]; - if (j2->poly1Idx == j->poly1Idx && PointIsVertex(j2->pt1a, pt)) - j2->poly1Idx = j->poly2Idx; - if (j2->poly2Idx == j->poly1Idx && PointIsVertex(j2->pt2a, pt)) - j2->poly2Idx = j->poly2Idx; - } -} -//---------------------------------------------------------------------- - -bool Poly2ContainsPoly1(OutPt* outPt1, OutPt* outPt2, bool UseFullInt64Range) -{ - //find the first pt in outPt1 that isn't also a vertex of outPt2 ... - OutPt* outPt = outPt1; - do - { - if (!PointIsVertex(outPt->pt, outPt2)) break; - outPt = outPt->next; - } - while (outPt != outPt1); - bool result; - //sometimes a point on one polygon can be touching the other polygon - //so to be totally confident outPt1 is inside outPt2 repeat ... - do - { - result = PointInPolygon(outPt->pt, outPt2, UseFullInt64Range); - outPt = outPt->next; - } - while (result && outPt != outPt1); - return result; -} -//---------------------------------------------------------------------- - -void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) -{ - - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec* outRec = m_PolyOuts[i]; - if (outRec->pts && outRec->FirstLeft == OldOutRec) - { - if (Poly2ContainsPoly1(outRec->pts, NewOutRec->pts, m_UseFullRange)) - outRec->FirstLeft = NewOutRec; - } - } -} -//---------------------------------------------------------------------- - -void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) -{ - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec* outRec = m_PolyOuts[i]; - if (outRec->FirstLeft == OldOutRec) outRec->FirstLeft = NewOutRec; - } -} -//---------------------------------------------------------------------- - -void Clipper::JoinCommonEdges() -{ - for (JoinList::size_type i = 0; i < m_Joins.size(); i++) - { - JoinRec* j = m_Joins[i]; - - OutRec *outRec1 = m_PolyOuts[j->poly1Idx]; - OutRec *outRec2 = m_PolyOuts[j->poly2Idx]; - - if (!outRec1->pts || !outRec2->pts) continue; - - //get the polygon fragment with the correct hole state (FirstLeft) - //before calling JoinPoints() ... - OutRec *holeStateRec; - if (outRec1 == outRec2) holeStateRec = outRec1; - else if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2; - else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1; - else holeStateRec = GetLowermostRec(outRec1, outRec2); - - OutPt *p1, *p2; - if (!JoinPoints(j, p1, p2)) continue; - - if (outRec1 == outRec2) - { - //instead of joining two polygons, we've just created a new one by - //splitting one polygon into two. - outRec1->pts = GetBottomPt(p1); - outRec1->bottomPt = outRec1->pts; - outRec1->bottomPt->idx = outRec1->idx; - outRec2 = CreateOutRec(); - m_PolyOuts.push_back(outRec2); - outRec2->idx = (int)m_PolyOuts.size()-1; - j->poly2Idx = outRec2->idx; - outRec2->pts = GetBottomPt(p2); - outRec2->bottomPt = outRec2->pts; - outRec2->bottomPt->idx = outRec2->idx; - - if (Poly2ContainsPoly1(outRec2->pts, outRec1->pts, m_UseFullRange)) - { - //outRec2 is contained by outRec1 ... - outRec2->isHole = !outRec1->isHole; - outRec2->FirstLeft = outRec1; - - FixupJoinRecs(j, p2, i+1); - - //fixup FirstLeft pointers that may need reassigning to OutRec1 - if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); - - FixupOutPolygon(*outRec1); //nb: do this BEFORE testing orientation - FixupOutPolygon(*outRec2); // but AFTER calling FixupJoinRecs() - - - if ((outRec2->isHole ^ m_ReverseOutput) == (Area(*outRec2, m_UseFullRange) > 0)) - ReversePolyPtLinks(outRec2->pts); - - } else if (Poly2ContainsPoly1(outRec1->pts, outRec2->pts, m_UseFullRange)) - { - //outRec1 is contained by outRec2 ... - outRec2->isHole = outRec1->isHole; - outRec1->isHole = !outRec2->isHole; - outRec2->FirstLeft = outRec1->FirstLeft; - outRec1->FirstLeft = outRec2; - - FixupJoinRecs(j, p2, i+1); - - //fixup FirstLeft pointers that may need reassigning to OutRec1 - if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); - - FixupOutPolygon(*outRec1); //nb: do this BEFORE testing orientation - FixupOutPolygon(*outRec2); // but AFTER calling FixupJoinRecs() - - if ((outRec1->isHole ^ m_ReverseOutput) == (Area(*outRec1, m_UseFullRange) > 0)) - ReversePolyPtLinks(outRec1->pts); - } - else - { - //the 2 polygons are completely separate ... - outRec2->isHole = outRec1->isHole; - outRec2->FirstLeft = outRec1->FirstLeft; - - FixupJoinRecs(j, p2, i+1); - - //fixup FirstLeft pointers that may need reassigning to OutRec2 - if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); - - FixupOutPolygon(*outRec1); //nb: do this BEFORE testing orientation - FixupOutPolygon(*outRec2); // but AFTER calling FixupJoinRecs() - } - - } else - { - //joined 2 polygons together ... - - //cleanup redundant edges ... - FixupOutPolygon(*outRec1); - - //delete the obsolete pointer ... - int OKIdx = outRec1->idx; - int ObsoleteIdx = outRec2->idx; - outRec2->pts = 0; - outRec2->bottomPt = 0; - - outRec1->isHole = holeStateRec->isHole; - if (holeStateRec == outRec2) - outRec1->FirstLeft = outRec2->FirstLeft; - outRec2->FirstLeft = outRec1; - - //now fixup any subsequent Joins that match this polygon - for (JoinList::size_type k = i+1; k < m_Joins.size(); k++) - { - JoinRec* j2 = m_Joins[k]; - if (j2->poly1Idx == ObsoleteIdx) j2->poly1Idx = OKIdx; - if (j2->poly2Idx == ObsoleteIdx) j2->poly2Idx = OKIdx; - } - - //fixup FirstLeft pointers that may need reassigning to OutRec1 - if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); - } - } -} -//------------------------------------------------------------------------------ - -void ReversePolygon(Polygon& p) -{ - std::reverse(p.begin(), p.end()); -} -//------------------------------------------------------------------------------ - -void ReversePolygons(Polygons& p) -{ - for (Polygons::size_type i = 0; i < p.size(); ++i) - ReversePolygon(p[i]); -} - -//------------------------------------------------------------------------------ -// OffsetPolygon functions ... -//------------------------------------------------------------------------------ - -struct DoublePoint -{ - double X; - double Y; - DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} -}; -//------------------------------------------------------------------------------ - -Polygon BuildArc(const IntPoint &pt, - const double a1, const double a2, const double r) -{ - long64 steps = std::max(6, int(std::sqrt(std::fabs(r)) * std::fabs(a2 - a1))); - if (steps > 0x100) steps = 0x100; - int n = (unsigned)steps; - Polygon result(n); - double da = (a2 - a1) / (n -1); - double a = a1; - for (int i = 0; i < n; ++i) - { - result[i].X = pt.X + Round(std::cos(a)*r); - result[i].Y = pt.Y + Round(std::sin(a)*r); - a += da; - } - return result; -} -//------------------------------------------------------------------------------ - -DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) -{ - if(pt2.X == pt1.X && pt2.Y == pt1.Y) - return DoublePoint(0, 0); - - 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); -} - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -class PolyOffsetBuilder -{ -private: - Polygons m_p; - Polygon* m_curr_poly; - std::vector normals; - double m_delta, m_RMin, m_R; - size_t m_i, m_j, m_k; - static const int buffLength = 128; - JoinType m_jointype; - -public: - - PolyOffsetBuilder(const Polygons& in_polys, Polygons& out_polys, - double delta, JoinType jointype, double MiterLimit, bool AutoFix) - { - //nb precondition - out_polys != ptsin_polys - if (NEAR_ZERO(delta)) - { - out_polys = in_polys; - return; - } - - this->m_p = in_polys; - this->m_delta = delta; - this->m_jointype = jointype; - - //ChecksInput - fixes polygon orientation if necessary and removes - //duplicate vertices. Can be set false when you're sure that polygon - //orientation is correct and that there are no duplicate vertices. - if (AutoFix) - { - size_t Len = m_p.size(), botI = 0; - while (botI < Len && m_p[botI].size() == 0) botI++; - if (botI == Len) return; - - //botPt: used to find the lowermost (in inverted Y-axis) & leftmost point - //This point (on m_p[botI]) must be on an outer polygon ring and if - //its orientation is false (counterclockwise) then assume all polygons - //need reversing ... - IntPoint botPt = m_p[botI][0]; - for (size_t i = botI; i < Len; ++i) - { - if (m_p[i].size() < 3) continue; - if (UpdateBotPt(m_p[i][0], botPt)) botI = i; - Polygon::iterator it = m_p[i].begin() +1; - while (it != m_p[i].end()) - { - if (PointsEqual(*it, *(it -1))) - it = m_p[i].erase(it); - else - { - if (UpdateBotPt(*it, botPt)) botI = i; - ++it; - } - } - } - if (!Orientation(m_p[botI])) - ReversePolygons(m_p); - } - - if (MiterLimit <= 1) MiterLimit = 1; - m_RMin = 2.0/(MiterLimit*MiterLimit); - - double deltaSq = delta*delta; - out_polys.clear(); - out_polys.resize(m_p.size()); - for (m_i = 0; m_i < m_p.size(); m_i++) - { - m_curr_poly = &out_polys[m_i]; - size_t len = m_p[m_i].size(); - if (len > 1 && m_p[m_i][0].X == m_p[m_i][len - 1].X && - m_p[m_i][0].Y == m_p[m_i][len-1].Y) len--; - - //when 'shrinking' polygons - to minimize artefacts - //strip those polygons that have an area < pi * delta^2 ... - double a1 = Area(m_p[m_i]); - if (delta < 0) { if (a1 > 0 && a1 < deltaSq *pi) len = 0; } - else if (a1 < 0 && -a1 < deltaSq *pi) len = 0; //holes have neg. area - - if (len == 0 || (len < 3 && delta <= 0)) - continue; - else if (len == 1) - { - Polygon arc; - arc = BuildArc(m_p[m_i][len-1], 0, 2 * pi, delta); - out_polys[m_i] = arc; - continue; - } - - //build normals ... - normals.clear(); - normals.resize(len); - normals[len-1] = GetUnitNormal(m_p[m_i][len-1], m_p[m_i][0]); - 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]); - - m_k = len -1; - for (m_j = 0; m_j < len; ++m_j) - { - switch (jointype) - { - case jtMiter: - { - m_R = 1 + (normals[m_j].X*normals[m_k].X + - normals[m_j].Y*normals[m_k].Y); - if (m_R >= m_RMin) DoMiter(); else DoSquare(MiterLimit); - break; - } - case jtSquare: DoSquare(); break; - case jtRound: DoRound(); break; - } - m_k = m_j; - } - } - - //finally, clean up untidy corners using Clipper ... - Clipper clpr; - clpr.AddPolygons(out_polys, ptSubject); - if (delta > 0) - { - if (!clpr.Execute(ctUnion, out_polys, pftPositive, pftPositive)) - out_polys.clear(); - } - else - { - IntRect r = clpr.GetBounds(); - Polygon 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.AddPolygon(outer, ptSubject); - if (clpr.Execute(ctUnion, out_polys, pftNegative, pftNegative)) - { - out_polys.erase(out_polys.begin()); - ReversePolygons(out_polys); - - } else - out_polys.clear(); - } - } -//------------------------------------------------------------------------------ - -private: - - void AddPoint(const IntPoint& pt) - { - Polygon::size_type len = m_curr_poly->size(); - if (len == m_curr_poly->capacity()) - m_curr_poly->reserve(len + buffLength); - m_curr_poly->push_back(pt); - } -//------------------------------------------------------------------------------ - - void DoSquare(double mul = 1.0) - { - IntPoint pt1 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_k].X * m_delta), - (long64)Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)); - IntPoint pt2 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta), - (long64)Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)); - if ((normals[m_k].X * normals[m_j].Y - normals[m_j].X * normals[m_k].Y) * m_delta >= 0) - { - double a1 = std::atan2(normals[m_k].Y, normals[m_k].X); - double a2 = std::atan2(-normals[m_j].Y, -normals[m_j].X); - a1 = std::fabs(a2 - a1); - if (a1 > pi) a1 = pi * 2 - a1; - double dx = std::tan((pi - a1) / 4) * std::fabs(m_delta * mul); - pt1 = IntPoint((long64)(pt1.X -normals[m_k].Y * dx), - (long64)(pt1.Y + normals[m_k].X * dx)); - AddPoint(pt1); - pt2 = IntPoint((long64)(pt2.X + normals[m_j].Y * dx), - (long64)(pt2.Y -normals[m_j].X * dx)); - AddPoint(pt2); - } - else - { - AddPoint(pt1); - AddPoint(m_p[m_i][m_j]); - AddPoint(pt2); - } - } -//------------------------------------------------------------------------------ - - void DoMiter() - { - if ((normals[m_k].X * normals[m_j].Y - normals[m_j].X * normals[m_k].Y) * m_delta >= 0) - { - double q = m_delta / m_R; - AddPoint(IntPoint((long64)Round(m_p[m_i][m_j].X + - (normals[m_k].X + normals[m_j].X) * q), - (long64)Round(m_p[m_i][m_j].Y + (normals[m_k].Y + normals[m_j].Y) * q))); - } - else - { - IntPoint pt1 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_k].X * - m_delta), (long64)Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)); - IntPoint pt2 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_j].X * - m_delta), (long64)Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)); - AddPoint(pt1); - AddPoint(m_p[m_i][m_j]); - AddPoint(pt2); - } - } -//------------------------------------------------------------------------------ - - void DoRound() - { - IntPoint pt1 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_k].X * m_delta), - (long64)Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)); - IntPoint pt2 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta), - (long64)Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)); - AddPoint(pt1); - //round off reflex angles (ie > 180 deg) unless almost flat (ie < ~10deg). - if ((normals[m_k].X*normals[m_j].Y - normals[m_j].X*normals[m_k].Y) * m_delta >= 0) - { - if (normals[m_j].X * normals[m_k].X + normals[m_j].Y * normals[m_k].Y < 0.985) - { - double a1 = std::atan2(normals[m_k].Y, normals[m_k].X); - double a2 = std::atan2(normals[m_j].Y, normals[m_j].X); - if (m_delta > 0 && a2 < a1) a2 += pi *2; - else if (m_delta < 0 && a2 > a1) a2 -= pi *2; - Polygon arc = BuildArc(m_p[m_i][m_j], a1, a2, m_delta); - for (Polygon::size_type m = 0; m < arc.size(); m++) - AddPoint(arc[m]); - } - } - else - AddPoint(m_p[m_i][m_j]); - AddPoint(pt2); - } -//-------------------------------------------------------------------------- - - bool UpdateBotPt(const IntPoint &pt, IntPoint &botPt) - { - if (pt.Y > botPt.Y || (pt.Y == botPt.Y && pt.X < botPt.X)) - { - botPt = pt; - return true; - } - else return false; - } -//-------------------------------------------------------------------------- - -}; //end PolyOffsetBuilder - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -void OffsetPolygons(const Polygons &in_polys, Polygons &out_polys, - double delta, JoinType jointype, double MiterLimit, bool AutoFix) -{ - if (&out_polys == &in_polys) - { - Polygons poly2(in_polys); - PolyOffsetBuilder(poly2, out_polys, delta, jointype, MiterLimit, AutoFix); - } - else PolyOffsetBuilder(in_polys, out_polys, delta, jointype, MiterLimit, AutoFix); -} -//------------------------------------------------------------------------------ - -void SimplifyPolygon(const Polygon &in_poly, Polygons &out_polys, PolyFillType fillType) -{ - Clipper c; - c.AddPolygon(in_poly, ptSubject); - c.Execute(ctUnion, out_polys, fillType, fillType); -} -//------------------------------------------------------------------------------ - -void SimplifyPolygons(const Polygons &in_polys, Polygons &out_polys, PolyFillType fillType) -{ - Clipper c; - c.AddPolygons(in_polys, ptSubject); - c.Execute(ctUnion, out_polys, fillType, fillType); -} -//------------------------------------------------------------------------------ - -void SimplifyPolygons(Polygons &polys, PolyFillType fillType) -{ - SimplifyPolygons(polys, polys, fillType); -} -//------------------------------------------------------------------------------ - -void CleanPolygon(Polygon& in_poly, Polygon& out_poly, double distance) -{ - //delta = proximity in units/pixels below which vertices - //will be stripped. Default ~= sqrt(2) so when adjacent - //vertices have both x & y coords within 1 unit, then - //the second vertex will be stripped. - int len = in_poly.size(); - if (len < 3) - out_poly.resize(0); - else - out_poly.resize(in_poly.size()); - - int d = (int)(distance * distance); - IntPoint p = in_poly[0]; - int j = 1; - for (int i = 1; i < len; i++) - { - if ((in_poly[i].X - p.X) * (in_poly[i].X - p.X) + - (in_poly[i].Y - p.Y) * (in_poly[i].Y - p.Y) <= d) - continue; - out_poly[j] = in_poly[i]; - p = in_poly[i]; - j++; - } - p = in_poly[j - 1]; - if ((in_poly[0].X - p.X) * (in_poly[0].X - p.X) + - (in_poly[0].Y - p.Y) * (in_poly[0].Y - p.Y) <= d) - j--; - if (j < len) - out_poly.resize(j); -} -//------------------------------------------------------------------------------ -void CleanPolygons(Polygons& in_polys, Polygons& out_polys, double distance) -{ - for (Polygons::size_type i = 0; i < in_polys.size(); ++i) - CleanPolygon(in_polys[i], out_polys[i], distance); -} -//------------------------------------------------------------------------------ - -void AddPolyNodeToPolygons(PolyNode& polynode, Polygons& polygons) -{ - if (polynode.Contour.size() > 0) - polygons.push_back(polynode.Contour); - for (int i = 0; i < polynode.ChildCount(); ++i) - AddPolyNodeToPolygons(*polynode.Childs[i], polygons); -} -//------------------------------------------------------------------------------ - -void PolyTreeToPolygons(PolyTree& polytree, Polygons& polygons) -{ - polygons.resize(0); - polygons.reserve(polytree.Total()); - AddPolyNodeToPolygons(polytree, polygons); -} -//------------------------------------------------------------------------------ - -std::ostream& operator <<(std::ostream &s, IntPoint& p) -{ - s << p.X << ' ' << p.Y << "\n"; - return s; -} -//------------------------------------------------------------------------------ - -std::ostream& operator <<(std::ostream &s, Polygon &p) -{ - for (Polygon::size_type i = 0; i < p.size(); i++) - s << p[i]; - s << "\n"; - return s; -} -//------------------------------------------------------------------------------ - -std::ostream& operator <<(std::ostream &s, Polygons &p) -{ - for (Polygons::size_type i = 0; i < p.size(); i++) - s << p[i]; - s << "\n"; - return s; -} -//------------------------------------------------------------------------------ - -} //ClipperLib namespace +/******************************************************************************* +* * +* Author : Angus Johnson * +* Version : 5.1.5 * +* Date : 4 May 2013 * +* Website : http://www.angusj.com * +* Copyright : Angus Johnson 2010-2013 * +* * +* License: * +* Use, modification & distribution is subject to Boost Software License Ver 1. * +* http://www.boost.org/LICENSE_1_0.txt * +* * +* Attributions: * +* The code in this library is an extension of Bala Vatti's clipping algorithm: * +* "A generic solution to polygon clipping" * +* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * +* http://portal.acm.org/citation.cfm?id=129906 * +* * +* Computer graphics and geometric modeling: implementation and algorithms * +* By Max K. Agoston * +* Springer; 1 edition (January 4, 2005) * +* http://books.google.com/books?q=vatti+clipping+agoston * +* * +* See also: * +* "Polygon Offsetting by Computing Winding Numbers" * +* Paper no. DETC2005-85513 pp. 565-575 * +* ASME 2005 International Design Engineering Technical Conferences * +* and Computers and Information in Engineering Conference (IDETC/CIE2005) * +* September 24-28, 2005 , Long Beach, California, USA * +* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * +* * +*******************************************************************************/ + +/******************************************************************************* +* * +* This is a translation of the Delphi Clipper library and the naming style * +* used has retained a Delphi flavour. * +* * +*******************************************************************************/ + +#include "clipper.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace ClipperLib { + +static long64 const loRange = 0x3FFFFFFF; +static long64 const hiRange = 0x3FFFFFFFFFFFFFFFLL; +static double const pi = 3.141592653589793238; +enum Direction { dRightToLeft, dLeftToRight }; + +#define HORIZONTAL (-1.0E+40) +#define TOLERANCE (1.0e-20) +#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) +#define NEAR_EQUAL(a, b) NEAR_ZERO((a) - (b)) + +inline long64 Abs(long64 val) +{ + return val < 0 ? -val : val; +} + +//------------------------------------------------------------------------------ +// PolyTree methods ... +//------------------------------------------------------------------------------ + +void PolyTree::Clear() +{ + for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) + delete AllNodes[i]; + AllNodes.resize(0); + Childs.resize(0); +} +//------------------------------------------------------------------------------ + +PolyNode* PolyTree::GetFirst() const +{ + if (!Childs.empty()) + return Childs[0]; + else + return 0; +} +//------------------------------------------------------------------------------ + +int PolyTree::Total() const +{ + return AllNodes.size(); +} + +//------------------------------------------------------------------------------ +// PolyNode methods ... +//------------------------------------------------------------------------------ + +PolyNode::PolyNode(): Childs(), Parent(0), Index(0) +{ +} +//------------------------------------------------------------------------------ + +int PolyNode::ChildCount() const +{ + return Childs.size(); +} +//------------------------------------------------------------------------------ + +void PolyNode::AddChild(PolyNode& child) +{ + unsigned cnt = Childs.size(); + Childs.push_back(&child); + child.Parent = this; + child.Index = cnt; +} +//------------------------------------------------------------------------------ + +PolyNode* PolyNode::GetNext() const +{ + if (!Childs.empty()) + return Childs[0]; + else + return GetNextSiblingUp(); +} +//------------------------------------------------------------------------------ + +PolyNode* PolyNode::GetNextSiblingUp() const +{ + if (!Parent) //protects against PolyTree.GetNextSiblingUp() + return 0; + else if (Index == Parent->Childs.size() - 1) + return Parent->GetNextSiblingUp(); + else + return Parent->Childs[Index + 1]; +} +//------------------------------------------------------------------------------ + +bool PolyNode::IsHole() const +{ + bool result = true; + PolyNode* node = Parent; + while (node) + { + result = !result; + node = node->Parent; + } + return result; +} + +//------------------------------------------------------------------------------ +// Int128 class (enables safe math on signed 64bit integers) +// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 +// Int128 val2((long64)9223372036854775807); +// Int128 val3 = val1 * val2; +// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) +//------------------------------------------------------------------------------ + +class Int128 +{ + public: + + ulong64 lo; + long64 hi; + + Int128(long64 _lo = 0) + { + lo = (ulong64)_lo; + if (_lo < 0) hi = -1; else hi = 0; + } + + + Int128(const Int128 &val): lo(val.lo), hi(val.hi){} + + Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} + + long64 operator = (const long64 &val) + { + lo = (ulong64)val; + if (val < 0) hi = -1; else hi = 0; + return val; + } + + bool operator == (const Int128 &val) const + {return (hi == val.hi && lo == val.lo);} + + bool operator != (const Int128 &val) const + { return !(*this == val);} + + bool operator > (const Int128 &val) const + { + if (hi != val.hi) + return hi > val.hi; + else + return lo > val.lo; + } + + bool operator < (const Int128 &val) const + { + if (hi != val.hi) + return hi < val.hi; + else + return lo < val.lo; + } + + bool operator >= (const Int128 &val) const + { return !(*this < val);} + + bool operator <= (const Int128 &val) const + { return !(*this > val);} + + Int128& operator += (const Int128 &rhs) + { + hi += rhs.hi; + lo += rhs.lo; + if (lo < rhs.lo) hi++; + return *this; + } + + Int128 operator + (const Int128 &rhs) const + { + Int128 result(*this); + result+= rhs; + return result; + } + + Int128& operator -= (const Int128 &rhs) + { + *this += -rhs; + return *this; + } + + Int128 operator - (const Int128 &rhs) const + { + Int128 result(*this); + result -= rhs; + return result; + } + + 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 ((long64)divisor.lo < 0) divisor.hi++; + divisor.lo <<= 1; + + cntr.hi <<= 1; + if ((long64)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); + else + return Int128(0); + } + + double AsDouble() const + { + const double shift64 = 18446744073709551616.0; //2^64 + if (hi < 0) + { + if (lo == 0) return (double)hi * shift64; + else return -(double)(~lo + ~hi * shift64); + } + else + return (double)(lo + hi * shift64); + } +}; + +Int128 Int128Mul (long64 lhs, long64 rhs) +{ + bool negate = (lhs < 0) != (rhs < 0); + + if (lhs < 0) lhs = -lhs; + ulong64 int1Hi = ulong64(lhs) >> 32; + ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); + + if (rhs < 0) rhs = -rhs; + ulong64 int2Hi = ulong64(rhs) >> 32; + ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); + + //nb: see comments in clipper.pas + ulong64 a = int1Hi * int2Hi; + ulong64 b = int1Lo * int2Lo; + ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; + + Int128 tmp; + 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; +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +bool FullRangeNeeded(const Polygon &pts) +{ + bool result = false; + for (Polygon::size_type i = 0; i < pts.size(); ++i) + { + if (Abs(pts[i].X) > hiRange || Abs(pts[i].Y) > hiRange) + throw "Coordinate exceeds range bounds."; + else if (Abs(pts[i].X) > loRange || Abs(pts[i].Y) > loRange) + result = true; + } + return result; +} +//------------------------------------------------------------------------------ + +bool Orientation(const Polygon &poly) +{ + return Area(poly) >= 0; +} +//------------------------------------------------------------------------------ + +inline bool PointsEqual( const IntPoint &pt1, const IntPoint &pt2) +{ + return ( pt1.X == pt2.X && pt1.Y == pt2.Y ); +} +//------------------------------------------------------------------------------ + +double Area(const Polygon &poly) +{ + int highI = (int)poly.size() -1; + if (highI < 2) return 0; + + if (FullRangeNeeded(poly)) { + Int128 a; + a = Int128Mul(poly[highI].X + poly[0].X, poly[0].Y - poly[highI].Y); + for (int i = 1; i <= highI; ++i) + a += Int128Mul(poly[i - 1].X + poly[i].X, poly[i].Y - poly[i -1].Y); + return a.AsDouble() / 2; + } + else + { + 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 Area(const OutRec &outRec, bool UseFullInt64Range) +{ + OutPt *op = outRec.pts; + if (!op) return 0; + if (UseFullInt64Range) { + Int128 a(0); + do { + a += Int128Mul(op->pt.X + op->prev->pt.X, op->prev->pt.Y - op->pt.Y); + op = op->next; + } while (op != outRec.pts); + return a.AsDouble() / 2; + } + else + { + double a = 0; + do { + a = a + (op->pt.X + op->prev->pt.X) * (op->prev->pt.Y - op->pt.Y); + op = op->next; + } while (op != outRec.pts); + return a / 2; + } +} +//------------------------------------------------------------------------------ + +bool PointIsVertex(const IntPoint &pt, OutPt *pp) +{ + OutPt *pp2 = pp; + do + { + if (PointsEqual(pp2->pt, pt)) return true; + pp2 = pp2->next; + } + while (pp2 != pp); + return false; +} +//------------------------------------------------------------------------------ + +bool PointOnLineSegment(const IntPoint pt, + const IntPoint linePt1, const IntPoint linePt2, bool UseFullInt64Range) +{ + 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 + 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))); +} +//------------------------------------------------------------------------------ + +bool PointOnPolygon(const IntPoint pt, + OutPt *pp, bool UseFullInt64Range) +{ + OutPt *pp2 = pp; + for (;;) + { + if (PointOnLineSegment(pt, pp2->pt, pp2->next->pt, UseFullInt64Range)) + return true; + pp2 = pp2->next; + if (pp2 == pp) return false; + } +} +//------------------------------------------------------------------------------ + +bool PointInPolygon(const IntPoint &pt, OutPt *pp, bool UseFullInt64Range) +{ + OutPt *pp2 = pp; + bool result = false; + if (UseFullInt64Range) { + do + { + if ((((pp2->pt.Y <= pt.Y) && (pt.Y < pp2->prev->pt.Y)) || + ((pp2->prev->pt.Y <= pt.Y) && (pt.Y < pp2->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); + } + else + { + do + { + if ((((pp2->pt.Y <= pt.Y) && (pt.Y < pp2->prev->pt.Y)) || + ((pp2->prev->pt.Y <= pt.Y) && (pt.Y < pp2->pt.Y))) && + (pt.X < (pp2->prev->pt.X - pp2->pt.X) * (pt.Y - pp2->pt.Y) / + (pp2->prev->pt.Y - pp2->pt.Y) + pp2->pt.X )) result = !result; + pp2 = pp2->next; + } + while (pp2 != pp); + } + return result; +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(TEdge &e1, TEdge &e2, bool UseFullInt64Range) +{ + if (UseFullInt64Range) + return Int128Mul(e1.deltaY, e2.deltaX) == Int128Mul(e1.deltaX, e2.deltaY); + else return e1.deltaY * e2.deltaX == e1.deltaX * e2.deltaY; +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, + const IntPoint pt3, bool UseFullInt64Range) +{ + if (UseFullInt64Range) + return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); + else return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, + const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) +{ + if (UseFullInt64Range) + return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); + else return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); +} +//------------------------------------------------------------------------------ + +double GetDx(const IntPoint pt1, const IntPoint pt2) +{ + return (pt1.Y == pt2.Y) ? + HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); +} +//--------------------------------------------------------------------------- + +void SetDx(TEdge &e) +{ + e.deltaX = (e.xtop - e.xbot); + e.deltaY = (e.ytop - e.ybot); + + if (e.deltaY == 0) e.dx = HORIZONTAL; + else e.dx = (double)(e.deltaX) / e.deltaY; +} +//--------------------------------------------------------------------------- + +void SwapSides(TEdge &edge1, TEdge &edge2) +{ + EdgeSide side = edge1.side; + edge1.side = edge2.side; + edge2.side = side; +} +//------------------------------------------------------------------------------ + +void SwapPolyIndexes(TEdge &edge1, TEdge &edge2) +{ + int outIdx = edge1.outIdx; + edge1.outIdx = edge2.outIdx; + edge2.outIdx = outIdx; +} +//------------------------------------------------------------------------------ + +inline long64 Round(double val) +{ + return (val < 0) ? static_cast(val - 0.5) : static_cast(val + 0.5); +} +//------------------------------------------------------------------------------ + +long64 TopX(TEdge &edge, const long64 currentY) +{ + return ( currentY == edge.ytop ) ? + edge.xtop : edge.xbot + Round(edge.dx *(currentY - edge.ybot)); +} +//------------------------------------------------------------------------------ + +bool IntersectPoint(TEdge &edge1, TEdge &edge2, + IntPoint &ip, bool UseFullInt64Range) +{ + double b1, b2; + if (SlopesEqual(edge1, edge2, UseFullInt64Range)) + { + if (edge2.ybot > edge1.ybot) ip.Y = edge2.ybot; + else ip.Y = edge1.ybot; + return false; + } + else if (NEAR_ZERO(edge1.dx)) + { + ip.X = edge1.xbot; + if (NEAR_EQUAL(edge2.dx, HORIZONTAL)) + ip.Y = edge2.ybot; + else + { + b2 = edge2.ybot - (edge2.xbot / edge2.dx); + ip.Y = Round(ip.X / edge2.dx + b2); + } + } + else if (NEAR_ZERO(edge2.dx)) + { + ip.X = edge2.xbot; + if (NEAR_EQUAL(edge1.dx, HORIZONTAL)) + ip.Y = edge1.ybot; + else + { + b1 = edge1.ybot - (edge1.xbot / edge1.dx); + ip.Y = Round(ip.X / edge1.dx + b1); + } + } + else + { + b1 = edge1.xbot - edge1.ybot * edge1.dx; + b2 = edge2.xbot - edge2.ybot * edge2.dx; + double q = (b2-b1) / (edge1.dx - edge2.dx); + ip.Y = Round(q); + if (std::fabs(edge1.dx) < std::fabs(edge2.dx)) + ip.X = Round(edge1.dx * q + b1); + else + ip.X = Round(edge2.dx * q + b2); + } + + if (ip.Y < edge1.ytop || ip.Y < edge2.ytop) + { + if (edge1.ytop > edge2.ytop) + { + ip.X = edge1.xtop; + ip.Y = edge1.ytop; + return TopX(edge2, edge1.ytop) < edge1.xtop; + } + else + { + ip.X = edge2.xtop; + ip.Y = edge2.ytop; + return TopX(edge1, edge2.ytop) > edge2.xtop; + } + } + else + return true; +} +//------------------------------------------------------------------------------ + +void ReversePolyPtLinks(OutPt *pp) +{ + if (!pp) return; + OutPt *pp1, *pp2; + pp1 = pp; + do { + pp2 = pp1->next; + pp1->next = pp1->prev; + pp1->prev = pp2; + pp1 = pp2; + } while( pp1 != pp ); +} +//------------------------------------------------------------------------------ + +void DisposeOutPts(OutPt*& pp) +{ + if (pp == 0) return; + pp->prev->next = 0; + while( pp ) + { + OutPt *tmpPp = pp; + pp = pp->next; + delete tmpPp; + } +} +//------------------------------------------------------------------------------ + +void InitEdge(TEdge *e, TEdge *eNext, + TEdge *ePrev, const IntPoint &pt, PolyType polyType) +{ + std::memset( e, 0, sizeof( TEdge )); + + e->next = eNext; + e->prev = ePrev; + e->xcurr = pt.X; + e->ycurr = pt.Y; + if (e->ycurr >= e->next->ycurr) + { + e->xbot = e->xcurr; + e->ybot = e->ycurr; + e->xtop = e->next->xcurr; + e->ytop = e->next->ycurr; + e->windDelta = 1; + } else + { + e->xtop = e->xcurr; + e->ytop = e->ycurr; + e->xbot = e->next->xcurr; + e->ybot = e->next->ycurr; + e->windDelta = -1; + } + SetDx(*e); + e->polyType = polyType; + e->outIdx = -1; +} +//------------------------------------------------------------------------------ + +inline void SwapX(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.] + e.xcurr = e.xtop; + e.xtop = e.xbot; + e.xbot = e.xcurr; +} +//------------------------------------------------------------------------------ + +void SwapPoints(IntPoint &pt1, IntPoint &pt2) +{ + IntPoint tmp = pt1; + pt1 = pt2; + pt2 = tmp; +} +//------------------------------------------------------------------------------ + +bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, + IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) +{ + //precondition: segments are colinear. + 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; + } 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; + } +} +//------------------------------------------------------------------------------ + +bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) +{ + OutPt *p = btmPt1->prev; + while (PointsEqual(p->pt, btmPt1->pt) && (p != btmPt1)) p = p->prev; + double dx1p = std::fabs(GetDx(btmPt1->pt, p->pt)); + p = btmPt1->next; + while (PointsEqual(p->pt, btmPt1->pt) && (p != btmPt1)) p = p->next; + double dx1n = std::fabs(GetDx(btmPt1->pt, p->pt)); + + p = btmPt2->prev; + while (PointsEqual(p->pt, btmPt2->pt) && (p != btmPt2)) p = p->prev; + double dx2p = std::fabs(GetDx(btmPt2->pt, p->pt)); + p = btmPt2->next; + while (PointsEqual(p->pt, btmPt2->pt) && (p != btmPt2)) p = p->next; + double dx2n = std::fabs(GetDx(btmPt2->pt, p->pt)); + return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); +} +//------------------------------------------------------------------------------ + +OutPt* GetBottomPt(OutPt *pp) +{ + OutPt* dups = 0; + OutPt* p = pp->next; + while (p != pp) + { + 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) + { + if (p->pt.X < pp->pt.X) + { + dups = 0; + pp = p; + } else + { + if (p->next != pp && p->prev != pp) dups = p; + } + } + p = p->next; + } + if (dups) + { + //there appears to be at least 2 vertices at bottomPt so ... + while (dups != p) + { + if (!FirstIsBottomPt(p, dups)) pp = dups; + dups = dups->next; + while (!PointsEqual(dups->pt, pp->pt)) dups = dups->next; + } + } + return 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 Pt3IsBetweenPt1AndPt2(const IntPoint pt1, + const IntPoint pt2, const IntPoint pt3) +{ + if (PointsEqual(pt1, pt3) || PointsEqual(pt2, pt3)) return true; + else if (pt1.X != pt2.X) return (pt1.X < pt3.X) == (pt3.X < pt2.X); + else return (pt1.Y < pt3.Y) == (pt3.Y < pt2.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; +} + +//------------------------------------------------------------------------------ +// ClipperBase class methods ... +//------------------------------------------------------------------------------ + +ClipperBase::ClipperBase() //constructor +{ + m_MinimaList = 0; + m_CurrentLM = 0; + m_UseFullRange = true; +} +//------------------------------------------------------------------------------ + +ClipperBase::~ClipperBase() //destructor +{ + Clear(); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::AddPolygon( const Polygon &pg, PolyType polyType) +{ + int len = (int)pg.size(); + if (len < 3) return false; + + Polygon p(len); + p[0] = pg[0]; + int j = 0; + + long64 maxVal; + if (m_UseFullRange) maxVal = hiRange; else maxVal = loRange; + + for (int i = 0; i < len; ++i) + { + if (Abs(pg[i].X) > maxVal || Abs(pg[i].Y) > maxVal) + { + if (Abs(pg[i].X) > hiRange || Abs(pg[i].Y) > hiRange) + throw "Coordinate exceeds range bounds"; + maxVal = hiRange; + m_UseFullRange = true; + } + + if (i == 0 || PointsEqual(p[j], pg[i])) continue; + else if (j > 0 && SlopesEqual(p[j-1], p[j], pg[i], m_UseFullRange)) + { + if (PointsEqual(p[j-1], pg[i])) j--; + } else j++; + p[j] = pg[i]; + } + if (j < 2) return false; + + len = j+1; + while (len > 2) + { + //nb: test for point equality before testing slopes ... + if (PointsEqual(p[j], p[0])) j--; + else if (PointsEqual(p[0], p[1]) || + SlopesEqual(p[j], p[0], p[1], m_UseFullRange)) + p[0] = p[j--]; + else if (SlopesEqual(p[j-1], p[j], p[0], m_UseFullRange)) j--; + else if (SlopesEqual(p[0], p[1], p[2], m_UseFullRange)) + { + for (int i = 2; i <= j; ++i) p[i-1] = p[i]; + j--; + } + else break; + len--; + } + if (len < 3) return false; + + //create a new edge array ... + TEdge *edges = new TEdge [len]; + m_edges.push_back(edges); + + //convert vertices to a double-linked-list of edges and initialize ... + edges[0].xcurr = p[0].X; + edges[0].ycurr = p[0].Y; + InitEdge(&edges[len-1], &edges[0], &edges[len-2], p[len-1], polyType); + for (int i = len-2; i > 0; --i) + InitEdge(&edges[i], &edges[i+1], &edges[i-1], p[i], polyType); + InitEdge(&edges[0], &edges[1], &edges[len-1], p[0], polyType); + + //reset xcurr & ycurr and find 'eHighest' (given the Y axis coordinates + //increase downward so the 'highest' edge will have the smallest ytop) ... + TEdge *e = &edges[0]; + TEdge *eHighest = e; + do + { + e->xcurr = e->xbot; + e->ycurr = e->ybot; + if (e->ytop < eHighest->ytop) eHighest = e; + e = e->next; + } + while ( e != &edges[0]); + + //make sure eHighest is positioned so the following loop works safely ... + if (eHighest->windDelta > 0) eHighest = eHighest->next; + if (NEAR_EQUAL(eHighest->dx, HORIZONTAL)) eHighest = eHighest->next; + + //finally insert each local minima ... + e = eHighest; + do { + e = AddBoundsToLML(e); + } + while( e != eHighest ); + return true; +} +//------------------------------------------------------------------------------ + +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; + } +} +//------------------------------------------------------------------------------ + +TEdge* ClipperBase::AddBoundsToLML(TEdge *e) +{ + //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->nextInLML = 0; + e = e->next; + for (;;) + { + if (NEAR_EQUAL(e->dx, HORIZONTAL)) + { + //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. + if (e->next->ytop < e->ytop && e->next->xbot > e->prev->xbot) break; + if (e->xtop != e->prev->xbot) SwapX(*e); + e->nextInLML = e->prev; + } + else if (e->ycurr == e->prev->ycurr) break; + else e->nextInLML = e->prev; + e = e->next; + } + + //e and e.prev are now at a local minima ... + LocalMinima* newLm = new LocalMinima; + newLm->next = 0; + newLm->Y = e->prev->ybot; + + if ( NEAR_EQUAL(e->dx, HORIZONTAL) ) //horizontal edges never start a left bound + { + if (e->xbot != e->prev->xbot) SwapX(*e); + newLm->leftBound = e->prev; + newLm->rightBound = e; + } else if (e->dx < e->prev->dx) + { + newLm->leftBound = e->prev; + newLm->rightBound = e; + } else + { + newLm->leftBound = e; + newLm->rightBound = e->prev; + } + newLm->leftBound->side = esLeft; + newLm->rightBound->side = esRight; + InsertLocalMinima( newLm ); + + for (;;) + { + if ( e->next->ytop == e->ytop && !NEAR_EQUAL(e->next->dx, HORIZONTAL) ) break; + e->nextInLML = e->next; + e = e->next; + if ( NEAR_EQUAL(e->dx, HORIZONTAL) && e->xbot != e->prev->xtop) SwapX(*e); + } + return e->next; +} +//------------------------------------------------------------------------------ + +bool ClipperBase::AddPolygons(const Polygons &ppg, PolyType polyType) +{ + bool result = false; + for (Polygons::size_type i = 0; i < ppg.size(); ++i) + if (AddPolygon(ppg[i], polyType)) result = true; + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::Clear() +{ + DisposeLocalMinimaList(); + for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) delete [] m_edges[i]; + m_edges.clear(); + m_UseFullRange = false; +} +//------------------------------------------------------------------------------ + +void ClipperBase::Reset() +{ + m_CurrentLM = m_MinimaList; + if( !m_CurrentLM ) return; //ie nothing to process + + //reset all edges ... + LocalMinima* lm = m_MinimaList; + while( lm ) + { + TEdge* e = lm->leftBound; + while( e ) + { + e->xcurr = e->xbot; + e->ycurr = e->ybot; + e->side = esLeft; + e->outIdx = -1; + e = e->nextInLML; + } + e = lm->rightBound; + while( e ) + { + e->xcurr = e->xbot; + e->ycurr = e->ybot; + e->side = esRight; + e->outIdx = -1; + e = e->nextInLML; + } + lm = lm->next; + } +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeLocalMinimaList() +{ + while( m_MinimaList ) + { + LocalMinima* tmpLm = m_MinimaList->next; + delete m_MinimaList; + m_MinimaList = tmpLm; + } + m_CurrentLM = 0; +} +//------------------------------------------------------------------------------ + +void ClipperBase::PopLocalMinima() +{ + if( ! m_CurrentLM ) return; + m_CurrentLM = m_CurrentLM->next; +} +//------------------------------------------------------------------------------ + +IntRect ClipperBase::GetBounds() +{ + IntRect result; + LocalMinima* lm = m_MinimaList; + if (!lm) + { + result.left = result.top = result.right = result.bottom = 0; + return result; + } + result.left = lm->leftBound->xbot; + result.top = lm->leftBound->ybot; + result.right = lm->leftBound->xbot; + result.bottom = lm->leftBound->ybot; + while (lm) + { + if (lm->leftBound->ybot > result.bottom) + result.bottom = lm->leftBound->ybot; + TEdge* e = lm->leftBound; + for (;;) { + TEdge* bottomE = e; + while (e->nextInLML) + { + if (e->xbot < result.left) result.left = e->xbot; + if (e->xbot > result.right) result.right = e->xbot; + e = e->nextInLML; + } + if (e->xbot < result.left) result.left = e->xbot; + if (e->xbot > result.right) result.right = e->xbot; + if (e->xtop < result.left) result.left = e->xtop; + if (e->xtop > result.right) result.right = e->xtop; + if (e->ytop < result.top) result.top = e->ytop; + + if (bottomE == lm->leftBound) e = lm->rightBound; + else break; + } + lm = lm->next; + } + return result; +} + + +//------------------------------------------------------------------------------ +// TClipper methods ... +//------------------------------------------------------------------------------ + +Clipper::Clipper() : ClipperBase() //constructor +{ + m_Scanbeam = 0; + m_ActiveEdges = 0; + m_SortedEdges = 0; + m_IntersectNodes = 0; + m_ExecuteLocked = false; + m_UseFullRange = false; + m_ReverseOutput = false; + m_ForceSimple = false; +} +//------------------------------------------------------------------------------ + +Clipper::~Clipper() //destructor +{ + Clear(); + DisposeScanbeamList(); +} +//------------------------------------------------------------------------------ + +void Clipper::Clear() +{ + if (m_edges.empty()) return; //avoids problems with ClipperBase destructor + DisposeAllPolyPts(); + ClipperBase::Clear(); +} +//------------------------------------------------------------------------------ + +void Clipper::DisposeScanbeamList() +{ + while ( m_Scanbeam ) { + Scanbeam* sb2 = m_Scanbeam->next; + delete m_Scanbeam; + m_Scanbeam = sb2; + } +} +//------------------------------------------------------------------------------ + +void Clipper::Reset() +{ + ClipperBase::Reset(); + m_Scanbeam = 0; + m_ActiveEdges = 0; + m_SortedEdges = 0; + DisposeAllPolyPts(); + LocalMinima* lm = m_MinimaList; + while (lm) + { + InsertScanbeam(lm->Y); + InsertScanbeam(lm->leftBound->ytop); + lm = lm->next; + } +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, Polygons &solution, + PolyFillType subjFillType, PolyFillType clipFillType) +{ + if( m_ExecuteLocked ) return false; + m_ExecuteLocked = true; + solution.resize(0); + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = false; + bool succeeded = ExecuteInternal(); + if (succeeded) BuildResult(solution); + m_ExecuteLocked = false; + return succeeded; +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, PolyTree& polytree, + PolyFillType subjFillType, PolyFillType clipFillType) +{ + if( m_ExecuteLocked ) return false; + m_ExecuteLocked = true; + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = true; + bool succeeded = ExecuteInternal(); + if (succeeded) BuildResult2(polytree); + m_ExecuteLocked = false; + return succeeded; +} +//------------------------------------------------------------------------------ + +void Clipper::FixHoleLinkage(OutRec &outrec) +{ + //skip OutRecs that (a) contain outermost polygons or + //(b) already have the correct owner/child linkage ... + if (!outrec.FirstLeft || + (outrec.isHole != outrec.FirstLeft->isHole && + outrec.FirstLeft->pts)) return; + + OutRec* orfl = outrec.FirstLeft; + while (orfl && ((orfl->isHole == outrec.isHole) || !orfl->pts)) + orfl = orfl->FirstLeft; + outrec.FirstLeft = orfl; +} +//------------------------------------------------------------------------------ + +bool Clipper::ExecuteInternal() +{ + bool succeeded; + try { + Reset(); + if (!m_CurrentLM ) return true; + long64 botY = PopScanbeam(); + do { + InsertLocalMinimaIntoAEL(botY); + ClearHorzJoins(); + ProcessHorizontals(); + long64 topY = PopScanbeam(); + succeeded = ProcessIntersections(botY, topY); + if (!succeeded) break; + ProcessEdgesAtTopOfScanbeam(topY); + botY = topY; + } while( m_Scanbeam ); + } + catch(...) { + succeeded = false; + } + + if (succeeded) + { + //tidy up output polygons and fix orientations where necessary ... + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec *outRec = m_PolyOuts[i]; + if (!outRec->pts) continue; + FixupOutPolygon(*outRec); + if (!outRec->pts) continue; + + if ((outRec->isHole ^ m_ReverseOutput) == (Area(*outRec, m_UseFullRange) > 0)) + ReversePolyPtLinks(outRec->pts); + } + + if (!m_Joins.empty()) JoinCommonEdges(); + if (m_ForceSimple) DoSimplePolygons(); + } + + ClearJoins(); + ClearHorzJoins(); + return succeeded; +} +//------------------------------------------------------------------------------ + +void Clipper::InsertScanbeam(const long64 Y) +{ + if( !m_Scanbeam ) + { + m_Scanbeam = new Scanbeam; + m_Scanbeam->next = 0; + m_Scanbeam->Y = Y; + } + else if( Y > m_Scanbeam->Y ) + { + Scanbeam* newSb = new Scanbeam; + newSb->Y = Y; + newSb->next = m_Scanbeam; + m_Scanbeam = newSb; + } else + { + Scanbeam* sb2 = m_Scanbeam; + while( sb2->next && ( Y <= sb2->next->Y ) ) sb2 = sb2->next; + if( Y == sb2->Y ) return; //ie ignores duplicates + Scanbeam* newSb = new Scanbeam; + newSb->Y = Y; + newSb->next = sb2->next; + sb2->next = newSb; + } +} +//------------------------------------------------------------------------------ + +long64 Clipper::PopScanbeam() +{ + long64 Y = m_Scanbeam->Y; + Scanbeam* sb2 = m_Scanbeam; + m_Scanbeam = m_Scanbeam->next; + delete sb2; + return Y; +} +//------------------------------------------------------------------------------ + +void Clipper::DisposeAllPolyPts(){ + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + DisposeOutRec(i); + m_PolyOuts.clear(); +} +//------------------------------------------------------------------------------ + +void Clipper::DisposeOutRec(PolyOutList::size_type index) +{ + OutRec *outRec = m_PolyOuts[index]; + if (outRec->pts) DisposeOutPts(outRec->pts); + delete outRec; + m_PolyOuts[index] = 0; +} +//------------------------------------------------------------------------------ + +void Clipper::SetWindingCount(TEdge &edge) +{ + TEdge *e = edge.prevInAEL; + //find the edge of the same polytype that immediately preceeds 'edge' in AEL + while ( e && e->polyType != edge.polyType ) e = e->prevInAEL; + if ( !e ) + { + edge.windCnt = edge.windDelta; + edge.windCnt2 = 0; + e = m_ActiveEdges; //ie get ready to calc windCnt2 + } else if ( IsEvenOddFillType(edge) ) + { + //EvenOdd filling ... + edge.windCnt = 1; + edge.windCnt2 = e->windCnt2; + e = e->nextInAEL; //ie get ready to calc windCnt2 + } else + { + //nonZero, Positive or Negative filling ... + if ( e->windCnt * e->windDelta < 0 ) + { + if (Abs(e->windCnt) > 1) + { + if (e->windDelta * edge.windDelta < 0) edge.windCnt = e->windCnt; + else edge.windCnt = e->windCnt + edge.windDelta; + } else + edge.windCnt = e->windCnt + e->windDelta + edge.windDelta; + } else + { + if ( Abs(e->windCnt) > 1 && e->windDelta * edge.windDelta < 0) + edge.windCnt = e->windCnt; + else if ( e->windCnt + edge.windDelta == 0 ) + edge.windCnt = e->windCnt; + else edge.windCnt = e->windCnt + edge.windDelta; + } + edge.windCnt2 = e->windCnt2; + e = e->nextInAEL; //ie get ready to calc windCnt2 + } + + //update windCnt2 ... + if ( IsEvenOddAltFillType(edge) ) + { + //EvenOdd filling ... + while ( e != &edge ) + { + edge.windCnt2 = (edge.windCnt2 == 0) ? 1 : 0; + e = e->nextInAEL; + } + } else + { + //nonZero, Positive or Negative filling ... + while ( e != &edge ) + { + edge.windCnt2 += e->windDelta; + e = e->nextInAEL; + } + } +} +//------------------------------------------------------------------------------ + +bool Clipper::IsEvenOddFillType(const TEdge& edge) const +{ + if (edge.polyType == ptSubject) + return m_SubjFillType == pftEvenOdd; else + return m_ClipFillType == pftEvenOdd; +} +//------------------------------------------------------------------------------ + +bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const +{ + if (edge.polyType == ptSubject) + return m_ClipFillType == pftEvenOdd; else + return m_SubjFillType == pftEvenOdd; +} +//------------------------------------------------------------------------------ + +bool Clipper::IsContributing(const TEdge& edge) const +{ + PolyFillType pft, pft2; + if (edge.polyType == ptSubject) + { + pft = m_SubjFillType; + pft2 = m_ClipFillType; + } else + { + pft = m_ClipFillType; + pft2 = m_SubjFillType; + } + + switch(pft) + { + case pftEvenOdd: + case pftNonZero: + if (Abs(edge.windCnt) != 1) return false; + break; + case pftPositive: + if (edge.windCnt != 1) return false; + break; + default: //pftNegative + if (edge.windCnt != -1) return false; + } + + switch(m_ClipType) + { + case ctIntersection: + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.windCnt2 != 0); + case pftPositive: + return (edge.windCnt2 > 0); + default: + return (edge.windCnt2 < 0); + } + case ctUnion: + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.windCnt2 == 0); + case pftPositive: + return (edge.windCnt2 <= 0); + default: + return (edge.windCnt2 >= 0); + } + case ctDifference: + if (edge.polyType == ptSubject) + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.windCnt2 == 0); + case pftPositive: + return (edge.windCnt2 <= 0); + default: + return (edge.windCnt2 >= 0); + } + else + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.windCnt2 != 0); + case pftPositive: + return (edge.windCnt2 > 0); + default: + return (edge.windCnt2 < 0); + } + default: + return true; + } +} +//------------------------------------------------------------------------------ + +void Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt) +{ + TEdge *e, *prevE; + if( NEAR_EQUAL(e2->dx, HORIZONTAL) || ( e1->dx > e2->dx ) ) + { + AddOutPt( e1, pt ); + e2->outIdx = e1->outIdx; + e1->side = esLeft; + e2->side = esRight; + e = e1; + if (e->prevInAEL == e2) + prevE = e2->prevInAEL; + else + prevE = e->prevInAEL; + } else + { + AddOutPt( e2, pt ); + e1->outIdx = e2->outIdx; + e1->side = esRight; + e2->side = esLeft; + e = e2; + if (e->prevInAEL == e1) + prevE = e1->prevInAEL; + else + prevE = e->prevInAEL; + } + if (prevE && prevE->outIdx >= 0 && + (TopX(*prevE, pt.Y) == TopX(*e, pt.Y)) && + SlopesEqual(*e, *prevE, m_UseFullRange)) + AddJoin(e, prevE, -1, -1); +} +//------------------------------------------------------------------------------ + +void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt) +{ + AddOutPt( e1, pt ); + if( e1->outIdx == e2->outIdx ) + { + e1->outIdx = -1; + e2->outIdx = -1; + } + else if (e1->outIdx < e2->outIdx) + AppendPolygon(e1, e2); + else + AppendPolygon(e2, e1); +} +//------------------------------------------------------------------------------ + +void Clipper::AddEdgeToSEL(TEdge *edge) +{ + //SEL pointers in PEdge are reused to build a list of horizontal edges. + //However, we don't need to worry about order with horizontal edge processing. + if( !m_SortedEdges ) + { + m_SortedEdges = edge; + edge->prevInSEL = 0; + edge->nextInSEL = 0; + } + else + { + edge->nextInSEL = m_SortedEdges; + edge->prevInSEL = 0; + m_SortedEdges->prevInSEL = edge; + m_SortedEdges = edge; + } +} +//------------------------------------------------------------------------------ + +void Clipper::CopyAELToSEL() +{ + TEdge* e = m_ActiveEdges; + m_SortedEdges = e; + while ( e ) + { + e->prevInSEL = e->prevInAEL; + e->nextInSEL = e->nextInAEL; + e = e->nextInAEL; + } +} +//------------------------------------------------------------------------------ + +void Clipper::AddJoin(TEdge *e1, TEdge *e2, int e1OutIdx, int e2OutIdx) +{ + JoinRec* jr = new JoinRec; + if (e1OutIdx >= 0) + jr->poly1Idx = e1OutIdx; else + jr->poly1Idx = e1->outIdx; + jr->pt1a = IntPoint(e1->xcurr, e1->ycurr); + jr->pt1b = IntPoint(e1->xtop, e1->ytop); + if (e2OutIdx >= 0) + jr->poly2Idx = e2OutIdx; else + jr->poly2Idx = e2->outIdx; + jr->pt2a = IntPoint(e2->xcurr, e2->ycurr); + jr->pt2b = IntPoint(e2->xtop, e2->ytop); + m_Joins.push_back(jr); +} +//------------------------------------------------------------------------------ + +void Clipper::ClearJoins() +{ + for (JoinList::size_type i = 0; i < m_Joins.size(); i++) + delete m_Joins[i]; + m_Joins.resize(0); +} +//------------------------------------------------------------------------------ + +void Clipper::AddHorzJoin(TEdge *e, int idx) +{ + HorzJoinRec* hj = new HorzJoinRec; + hj->edge = e; + hj->savedIdx = idx; + m_HorizJoins.push_back(hj); +} +//------------------------------------------------------------------------------ + +void Clipper::ClearHorzJoins() +{ + for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); i++) + delete m_HorizJoins[i]; + m_HorizJoins.resize(0); +} +//------------------------------------------------------------------------------ + +void Clipper::InsertLocalMinimaIntoAEL(const long64 botY) +{ + while( m_CurrentLM && ( m_CurrentLM->Y == botY ) ) + { + TEdge* lb = m_CurrentLM->leftBound; + TEdge* rb = m_CurrentLM->rightBound; + + InsertEdgeIntoAEL( lb ); + InsertScanbeam( lb->ytop ); + InsertEdgeIntoAEL( rb ); + + if (IsEvenOddFillType(*lb)) + { + lb->windDelta = 1; + rb->windDelta = 1; + } + else + { + rb->windDelta = -lb->windDelta; + } + SetWindingCount( *lb ); + rb->windCnt = lb->windCnt; + rb->windCnt2 = lb->windCnt2; + + if( NEAR_EQUAL(rb->dx, HORIZONTAL) ) + { + //nb: only rightbounds can have a horizontal bottom edge + AddEdgeToSEL( rb ); + InsertScanbeam( rb->nextInLML->ytop ); + } + else + InsertScanbeam( rb->ytop ); + + if( IsContributing(*lb) ) + AddLocalMinPoly( lb, rb, IntPoint(lb->xcurr, m_CurrentLM->Y) ); + + //if any output polygons share an edge, they'll need joining later ... + if (rb->outIdx >= 0 && NEAR_EQUAL(rb->dx, HORIZONTAL)) + { + for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); ++i) + { + IntPoint pt, pt2; //returned by GetOverlapSegment() but unused here. + HorzJoinRec* hj = m_HorizJoins[i]; + //if horizontals rb and hj.edge overlap, flag for joining later ... + if (GetOverlapSegment(IntPoint(hj->edge->xbot, hj->edge->ybot), + IntPoint(hj->edge->xtop, hj->edge->ytop), + IntPoint(rb->xbot, rb->ybot), + IntPoint(rb->xtop, rb->ytop), pt, pt2)) + AddJoin(hj->edge, rb, hj->savedIdx); + } + } + + if( lb->nextInAEL != rb ) + { + if (rb->outIdx >= 0 && rb->prevInAEL->outIdx >= 0 && + SlopesEqual(*rb->prevInAEL, *rb, m_UseFullRange)) + AddJoin(rb, rb->prevInAEL); + + TEdge* e = lb->nextInAEL; + IntPoint pt = IntPoint(lb->xcurr, lb->ycurr); + while( e != rb ) + { + if(!e) throw clipperException("InsertLocalMinimaIntoAEL: missing rightbound!"); + //nb: For calculating winding counts etc, IntersectEdges() assumes + //that param1 will be to the right of param2 ABOVE the intersection ... + IntersectEdges( rb , e , pt , ipNone); //order important here + e = e->nextInAEL; + } + } + PopLocalMinima(); + } +} +//------------------------------------------------------------------------------ + +void Clipper::DeleteFromAEL(TEdge *e) +{ + TEdge* AelPrev = e->prevInAEL; + TEdge* AelNext = e->nextInAEL; + if( !AelPrev && !AelNext && (e != m_ActiveEdges) ) return; //already deleted + if( AelPrev ) AelPrev->nextInAEL = AelNext; + else m_ActiveEdges = AelNext; + if( AelNext ) AelNext->prevInAEL = AelPrev; + e->nextInAEL = 0; + e->prevInAEL = 0; +} +//------------------------------------------------------------------------------ + +void Clipper::DeleteFromSEL(TEdge *e) +{ + TEdge* SelPrev = e->prevInSEL; + TEdge* SelNext = e->nextInSEL; + if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted + if( SelPrev ) SelPrev->nextInSEL = SelNext; + else m_SortedEdges = SelNext; + if( SelNext ) SelNext->prevInSEL = SelPrev; + e->nextInSEL = 0; + e->prevInSEL = 0; +} +//------------------------------------------------------------------------------ + +void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, + const IntPoint &pt, const IntersectProtects protects) +{ + //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 = !(ipLeft & protects) && !e1->nextInLML && + e1->xtop == pt.X && e1->ytop == pt.Y; + bool e2stops = !(ipRight & protects) && !e2->nextInLML && + e2->xtop == pt.X && e2->ytop == pt.Y; + bool e1Contributing = ( e1->outIdx >= 0 ); + bool e2contributing = ( e2->outIdx >= 0 ); + + //update winding counts... + //assumes that e1 will be to the right of e2 ABOVE the intersection + if ( e1->polyType == e2->polyType ) + { + if ( IsEvenOddFillType( *e1) ) + { + int oldE1WindCnt = e1->windCnt; + e1->windCnt = e2->windCnt; + e2->windCnt = oldE1WindCnt; + } else + { + if (e1->windCnt + e2->windDelta == 0 ) e1->windCnt = -e1->windCnt; + else e1->windCnt += e2->windDelta; + if ( e2->windCnt - e1->windDelta == 0 ) e2->windCnt = -e2->windCnt; + else e2->windCnt -= e1->windDelta; + } + } else + { + if (!IsEvenOddFillType(*e2)) e1->windCnt2 += e2->windDelta; + else e1->windCnt2 = ( e1->windCnt2 == 0 ) ? 1 : 0; + if (!IsEvenOddFillType(*e1)) e2->windCnt2 -= e1->windDelta; + else e2->windCnt2 = ( e2->windCnt2 == 0 ) ? 1 : 0; + } + + PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; + if (e1->polyType == ptSubject) + { + e1FillType = m_SubjFillType; + e1FillType2 = m_ClipFillType; + } else + { + e1FillType = m_ClipFillType; + e1FillType2 = m_SubjFillType; + } + if (e2->polyType == ptSubject) + { + e2FillType = m_SubjFillType; + e2FillType2 = m_ClipFillType; + } else + { + e2FillType = m_ClipFillType; + e2FillType2 = m_SubjFillType; + } + + long64 e1Wc, e2Wc; + switch (e1FillType) + { + case pftPositive: e1Wc = e1->windCnt; break; + case pftNegative: e1Wc = -e1->windCnt; break; + default: e1Wc = Abs(e1->windCnt); + } + switch(e2FillType) + { + case pftPositive: e2Wc = e2->windCnt; break; + case pftNegative: e2Wc = -e2->windCnt; break; + default: e2Wc = Abs(e2->windCnt); + } + + if ( e1Contributing && e2contributing ) + { + if ( e1stops || e2stops || + (e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || + (e1->polyType != e2->polyType && m_ClipType != ctXor) ) + AddLocalMaxPoly(e1, e2, pt); + else + { + AddOutPt(e1, pt); + AddOutPt(e2, pt); + SwapSides( *e1 , *e2 ); + SwapPolyIndexes( *e1 , *e2 ); + } + } + else if ( e1Contributing ) + { + if (e2Wc == 0 || e2Wc == 1) + { + AddOutPt(e1, pt); + SwapSides(*e1, *e2); + SwapPolyIndexes(*e1, *e2); + } + } + else if ( e2contributing ) + { + if (e1Wc == 0 || e1Wc == 1) + { + AddOutPt(e2, pt); + SwapSides(*e1, *e2); + SwapPolyIndexes(*e1, *e2); + } + } + else if ( (e1Wc == 0 || e1Wc == 1) && + (e2Wc == 0 || e2Wc == 1) && !e1stops && !e2stops ) + { + //neither edge is currently contributing ... + + long64 e1Wc2, e2Wc2; + switch (e1FillType2) + { + case pftPositive: e1Wc2 = e1->windCnt2; break; + case pftNegative : e1Wc2 = -e1->windCnt2; break; + default: e1Wc2 = Abs(e1->windCnt2); + } + switch (e2FillType2) + { + case pftPositive: e2Wc2 = e2->windCnt2; break; + case pftNegative: e2Wc2 = -e2->windCnt2; break; + default: e2Wc2 = Abs(e2->windCnt2); + } + + if (e1->polyType != e2->polyType) + AddLocalMinPoly(e1, e2, pt); + else if (e1Wc == 1 && e2Wc == 1) + switch( m_ClipType ) { + case ctIntersection: + if (e1Wc2 > 0 && e2Wc2 > 0) + AddLocalMinPoly(e1, e2, pt); + break; + case ctUnion: + if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) + AddLocalMinPoly(e1, e2, pt); + break; + case ctDifference: + if (((e1->polyType == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || + ((e1->polyType == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) + AddLocalMinPoly(e1, e2, pt); + break; + case ctXor: + AddLocalMinPoly(e1, e2, pt); + } + 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 ); +} +//------------------------------------------------------------------------------ + +void Clipper::SetHoleState(TEdge *e, OutRec *outrec) +{ + bool isHole = false; + TEdge *e2 = e->prevInAEL; + while (e2) + { + if (e2->outIdx >= 0) + { + isHole = !isHole; + if (! outrec->FirstLeft) + outrec->FirstLeft = m_PolyOuts[e2->outIdx]; + } + e2 = e2->prevInAEL; + } + if (isHole) outrec->isHole = true; +} +//------------------------------------------------------------------------------ + +OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) +{ + //work out which polygon fragment has the correct hole state ... + if (!outRec1->bottomPt) + outRec1->bottomPt = GetBottomPt(outRec1->pts); + if (!outRec2->bottomPt) + 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; + else if (outPt1->next == outPt1) return outRec2; + else if (outPt2->next == outPt2) return outRec1; + else if (FirstIsBottomPt(outPt1, outPt2)) return outRec1; + else return outRec2; +} +//------------------------------------------------------------------------------ + +bool Param1RightOfParam2(OutRec* outRec1, OutRec* outRec2) +{ + do + { + outRec1 = outRec1->FirstLeft; + if (outRec1 == outRec2) return true; + } while (outRec1); + return false; +} +//------------------------------------------------------------------------------ + +OutRec* Clipper::GetOutRec(int idx) +{ + OutRec* outrec = m_PolyOuts[idx]; + while (outrec != m_PolyOuts[outrec->idx]) + outrec = m_PolyOuts[outrec->idx]; + return outrec; +} +//------------------------------------------------------------------------------ + +void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) +{ + //get the start and ends of both output polygons ... + OutRec *outRec1 = m_PolyOuts[e1->outIdx]; + OutRec *outRec2 = m_PolyOuts[e2->outIdx]; + + OutRec *holeStateRec; + if (Param1RightOfParam2(outRec1, outRec2)) + holeStateRec = outRec2; + else if (Param1RightOfParam2(outRec2, outRec1)) + holeStateRec = outRec1; + else + holeStateRec = GetLowermostRec(outRec1, outRec2); + + OutPt* p1_lft = outRec1->pts; + OutPt* p1_rt = p1_lft->prev; + OutPt* p2_lft = outRec2->pts; + OutPt* p2_rt = p2_lft->prev; + + EdgeSide side; + //join e2 poly onto e1 poly and delete pointers to e2 ... + if( e1->side == esLeft ) + { + if( e2->side == esLeft ) + { + //z y x a b c + ReversePolyPtLinks(p2_lft); + p2_lft->next = p1_lft; + p1_lft->prev = p2_lft; + p1_rt->next = p2_rt; + p2_rt->prev = p1_rt; + outRec1->pts = p2_rt; + } else + { + //x y z a b c + p2_rt->next = p1_lft; + p1_lft->prev = p2_rt; + p2_lft->prev = p1_rt; + p1_rt->next = p2_lft; + outRec1->pts = p2_lft; + } + side = esLeft; + } else + { + if( e2->side == esRight ) + { + //a b c z y x + ReversePolyPtLinks(p2_lft); + p1_rt->next = p2_rt; + p2_rt->prev = p1_rt; + p2_lft->next = p1_lft; + p1_lft->prev = p2_lft; + } else + { + //a b c x y z + p1_rt->next = p2_lft; + p2_lft->prev = p1_rt; + p1_lft->prev = p2_rt; + p2_rt->next = p1_lft; + } + side = esRight; + } + + outRec1->bottomPt = 0; + if (holeStateRec == outRec2) + { + if (outRec2->FirstLeft != outRec1) + outRec1->FirstLeft = outRec2->FirstLeft; + outRec1->isHole = outRec2->isHole; + } + outRec2->pts = 0; + outRec2->bottomPt = 0; + + outRec2->FirstLeft = outRec1; + + int OKIdx = e1->outIdx; + int ObsoleteIdx = e2->outIdx; + + e1->outIdx = -1; //nb: safe because we only get here via AddLocalMaxPoly + e2->outIdx = -1; + + TEdge* e = m_ActiveEdges; + while( e ) + { + if( e->outIdx == ObsoleteIdx ) + { + e->outIdx = OKIdx; + e->side = side; + break; + } + e = e->nextInAEL; + } + + outRec2->idx = outRec1->idx; +} +//------------------------------------------------------------------------------ + +OutRec* Clipper::CreateOutRec() +{ + OutRec* result = new OutRec; + result->isHole = false; + result->FirstLeft = 0; + result->pts = 0; + result->bottomPt = 0; + result->polyNode = 0; + m_PolyOuts.push_back(result); + result->idx = (int)m_PolyOuts.size()-1; + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::AddOutPt(TEdge *e, const IntPoint &pt) +{ + bool ToFront = (e->side == esLeft); + if( e->outIdx < 0 ) + { + OutRec *outRec = CreateOutRec(); + e->outIdx = outRec->idx; + OutPt* op = new OutPt; + outRec->pts = op; + op->pt = pt; + op->idx = outRec->idx; + op->next = op; + op->prev = op; + SetHoleState(e, outRec); + } else + { + OutRec *outRec = m_PolyOuts[e->outIdx]; + OutPt* op = outRec->pts; + if ((ToFront && PointsEqual(pt, op->pt)) || + (!ToFront && PointsEqual(pt, op->prev->pt))) return; + + OutPt* op2 = new OutPt; + op2->pt = pt; + op2->idx = outRec->idx; + op2->next = op; + op2->prev = op->prev; + op2->prev->next = op2; + op->prev = op2; + if (ToFront) outRec->pts = op2; + } +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessHorizontals() +{ + TEdge* horzEdge = m_SortedEdges; + while( horzEdge ) + { + DeleteFromSEL( horzEdge ); + ProcessHorizontal( horzEdge ); + horzEdge = m_SortedEdges; + } +} +//------------------------------------------------------------------------------ + +bool Clipper::IsTopHorz(const long64 XPos) +{ + TEdge* e = m_SortedEdges; + while( e ) + { + if( ( XPos >= std::min(e->xcurr, e->xtop) ) && + ( XPos <= std::max(e->xcurr, e->xtop) ) ) return false; + e = e->nextInSEL; + } + return true; +} +//------------------------------------------------------------------------------ + +inline bool IsMinima(TEdge *e) +{ + return e && (e->prev->nextInLML != e) && (e->next->nextInLML != e); +} +//------------------------------------------------------------------------------ + +inline bool IsMaxima(TEdge *e, const long64 Y) +{ + return e && e->ytop == Y && !e->nextInLML; +} +//------------------------------------------------------------------------------ + +inline bool IsIntermediate(TEdge *e, const long64 Y) +{ + return e->ytop == Y && e->nextInLML; +} +//------------------------------------------------------------------------------ + +TEdge *GetMaximaPair(TEdge *e) +{ + if( !IsMaxima(e->next, e->ytop) || e->next->xtop != e->xtop ) + return e->prev; else + return e->next; +} +//------------------------------------------------------------------------------ + +void Clipper::SwapPositionsInAEL(TEdge *edge1, TEdge *edge2) +{ + if( edge1->nextInAEL == edge2 ) + { + TEdge* next = edge2->nextInAEL; + if( next ) next->prevInAEL = edge1; + TEdge* prev = edge1->prevInAEL; + if( prev ) prev->nextInAEL = edge2; + edge2->prevInAEL = prev; + edge2->nextInAEL = edge1; + edge1->prevInAEL = edge2; + edge1->nextInAEL = next; + } + else if( edge2->nextInAEL == edge1 ) + { + TEdge* next = edge1->nextInAEL; + if( next ) next->prevInAEL = edge2; + TEdge* prev = edge2->prevInAEL; + if( prev ) prev->nextInAEL = edge1; + edge1->prevInAEL = prev; + edge1->nextInAEL = edge2; + edge2->prevInAEL = edge1; + edge2->nextInAEL = next; + } + else + { + TEdge* next = edge1->nextInAEL; + TEdge* prev = edge1->prevInAEL; + edge1->nextInAEL = edge2->nextInAEL; + if( edge1->nextInAEL ) edge1->nextInAEL->prevInAEL = edge1; + edge1->prevInAEL = edge2->prevInAEL; + if( edge1->prevInAEL ) edge1->prevInAEL->nextInAEL = edge1; + edge2->nextInAEL = next; + if( edge2->nextInAEL ) edge2->nextInAEL->prevInAEL = edge2; + edge2->prevInAEL = prev; + if( edge2->prevInAEL ) edge2->prevInAEL->nextInAEL = edge2; + } + + if( !edge1->prevInAEL ) m_ActiveEdges = edge1; + else if( !edge2->prevInAEL ) m_ActiveEdges = edge2; +} +//------------------------------------------------------------------------------ + +void Clipper::SwapPositionsInSEL(TEdge *edge1, TEdge *edge2) +{ + if( !( edge1->nextInSEL ) && !( edge1->prevInSEL ) ) return; + if( !( edge2->nextInSEL ) && !( edge2->prevInSEL ) ) return; + + if( edge1->nextInSEL == edge2 ) + { + TEdge* next = edge2->nextInSEL; + if( next ) next->prevInSEL = edge1; + TEdge* prev = edge1->prevInSEL; + if( prev ) prev->nextInSEL = edge2; + edge2->prevInSEL = prev; + edge2->nextInSEL = edge1; + edge1->prevInSEL = edge2; + edge1->nextInSEL = next; + } + else if( edge2->nextInSEL == edge1 ) + { + TEdge* next = edge1->nextInSEL; + if( next ) next->prevInSEL = edge2; + TEdge* prev = edge2->prevInSEL; + if( prev ) prev->nextInSEL = edge1; + edge1->prevInSEL = prev; + edge1->nextInSEL = edge2; + edge2->prevInSEL = edge1; + edge2->nextInSEL = next; + } + else + { + TEdge* next = edge1->nextInSEL; + TEdge* prev = edge1->prevInSEL; + edge1->nextInSEL = edge2->nextInSEL; + if( edge1->nextInSEL ) edge1->nextInSEL->prevInSEL = edge1; + edge1->prevInSEL = edge2->prevInSEL; + if( edge1->prevInSEL ) edge1->prevInSEL->nextInSEL = edge1; + edge2->nextInSEL = next; + if( edge2->nextInSEL ) edge2->nextInSEL->prevInSEL = edge2; + edge2->prevInSEL = prev; + if( edge2->prevInSEL ) edge2->prevInSEL->nextInSEL = edge2; + } + + if( !edge1->prevInSEL ) m_SortedEdges = edge1; + else if( !edge2->prevInSEL ) m_SortedEdges = edge2; +} +//------------------------------------------------------------------------------ + +TEdge* GetNextInAEL(TEdge *e, Direction dir) +{ + return dir == dLeftToRight ? e->nextInAEL : e->prevInAEL; +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessHorizontal(TEdge *horzEdge) +{ + Direction dir; + long64 horzLeft, horzRight; + + if( horzEdge->xcurr < horzEdge->xtop ) + { + horzLeft = horzEdge->xcurr; + horzRight = horzEdge->xtop; + dir = dLeftToRight; + } else + { + horzLeft = horzEdge->xtop; + horzRight = horzEdge->xcurr; + dir = dRightToLeft; + } + + TEdge* eMaxPair; + if( horzEdge->nextInLML ) eMaxPair = 0; + else eMaxPair = GetMaximaPair(horzEdge); + + TEdge* e = GetNextInAEL( horzEdge , dir ); + while( e ) + { + if ( e->xcurr == horzEdge->xtop && !eMaxPair ) + { + if (SlopesEqual(*e, *horzEdge->nextInLML, m_UseFullRange)) + { + //if output polygons share an edge, they'll need joining later ... + if (horzEdge->outIdx >= 0 && e->outIdx >= 0) + AddJoin(horzEdge->nextInLML, e, horzEdge->outIdx); + break; //we've reached the end of the horizontal line + } + else if (e->dx < horzEdge->nextInLML->dx) + //we really have got to the end of the intermediate horz edge so quit. + //nb: More -ve slopes follow more +ve slopes ABOVE the horizontal. + break; + } + + TEdge* eNext = GetNextInAEL( e, dir ); + + if (eMaxPair || + ((dir == dLeftToRight) && (e->xcurr < horzRight)) || + ((dir == dRightToLeft) && (e->xcurr > horzLeft))) + { + //so far we're still in range of the horizontal edge + if( e == eMaxPair ) + { + //horzEdge is evidently a maxima horizontal and we've arrived at its end. + if (dir == dLeftToRight) + IntersectEdges(horzEdge, e, IntPoint(e->xcurr, horzEdge->ycurr), ipNone); + else + IntersectEdges(e, horzEdge, IntPoint(e->xcurr, horzEdge->ycurr), ipNone); + if (eMaxPair->outIdx >= 0) throw clipperException("ProcessHorizontal error"); + return; + } + else if( NEAR_EQUAL(e->dx, HORIZONTAL) && !IsMinima(e) && !(e->xcurr > e->xtop) ) + { + //An overlapping horizontal edge. Overlapping horizontal edges are + //processed as if layered with the current horizontal edge (horizEdge) + //being infinitesimally lower that the next (e). Therfore, we + //intersect with e only if e.xcurr is within the bounds of horzEdge ... + if( dir == dLeftToRight ) + IntersectEdges( horzEdge , e, IntPoint(e->xcurr, horzEdge->ycurr), + (IsTopHorz( e->xcurr ))? ipLeft : ipBoth ); + else + IntersectEdges( e, horzEdge, IntPoint(e->xcurr, horzEdge->ycurr), + (IsTopHorz( e->xcurr ))? ipRight : ipBoth ); + } + else if( dir == dLeftToRight ) + { + IntersectEdges( horzEdge, e, IntPoint(e->xcurr, horzEdge->ycurr), + (IsTopHorz( e->xcurr ))? ipLeft : ipBoth ); + } + else + { + IntersectEdges( e, horzEdge, IntPoint(e->xcurr, horzEdge->ycurr), + (IsTopHorz( e->xcurr ))? ipRight : ipBoth ); + } + SwapPositionsInAEL( horzEdge, e ); + } + else if( (dir == dLeftToRight && e->xcurr >= horzRight) || + (dir == dRightToLeft && e->xcurr <= horzLeft) ) break; + e = eNext; + } //end while + + if( horzEdge->nextInLML ) + { + if( horzEdge->outIdx >= 0 ) + AddOutPt( horzEdge, IntPoint(horzEdge->xtop, horzEdge->ytop)); + UpdateEdgeIntoAEL( horzEdge ); + } + else + { + if ( horzEdge->outIdx >= 0 ) + IntersectEdges( horzEdge, eMaxPair, + IntPoint(horzEdge->xtop, horzEdge->ycurr), ipBoth); + if (eMaxPair->outIdx >= 0) throw clipperException("ProcessHorizontal error"); + DeleteFromAEL(eMaxPair); + DeleteFromAEL(horzEdge); + } +} +//------------------------------------------------------------------------------ + +void Clipper::UpdateEdgeIntoAEL(TEdge *&e) +{ + if( !e->nextInLML ) throw + clipperException("UpdateEdgeIntoAEL: invalid call"); + TEdge* AelPrev = e->prevInAEL; + TEdge* AelNext = e->nextInAEL; + e->nextInLML->outIdx = e->outIdx; + if( AelPrev ) AelPrev->nextInAEL = e->nextInLML; + else m_ActiveEdges = e->nextInLML; + if( AelNext ) AelNext->prevInAEL = e->nextInLML; + e->nextInLML->side = e->side; + e->nextInLML->windDelta = e->windDelta; + e->nextInLML->windCnt = e->windCnt; + e->nextInLML->windCnt2 = e->windCnt2; + e = e->nextInLML; + e->prevInAEL = AelPrev; + e->nextInAEL = AelNext; + if( !NEAR_EQUAL(e->dx, HORIZONTAL) ) InsertScanbeam( e->ytop ); +} +//------------------------------------------------------------------------------ + +bool Clipper::ProcessIntersections(const long64 botY, const long64 topY) +{ + if( !m_ActiveEdges ) return true; + try { + BuildIntersectList(botY, topY); + if (!m_IntersectNodes) return true; + if (!m_IntersectNodes->next || FixupIntersectionOrder()) ProcessIntersectList(); + else return false; + } + catch(...) { + m_SortedEdges = 0; + DisposeIntersectNodes(); + throw clipperException("ProcessIntersections error"); + } + m_SortedEdges = 0; + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::DisposeIntersectNodes() +{ + while ( m_IntersectNodes ) + { + IntersectNode* iNode = m_IntersectNodes->next; + delete m_IntersectNodes; + m_IntersectNodes = iNode; + } +} +//------------------------------------------------------------------------------ + +void Clipper::BuildIntersectList(const long64 botY, const long64 topY) +{ + if ( !m_ActiveEdges ) return; + + //prepare for sorting ... + TEdge* e = m_ActiveEdges; + m_SortedEdges = e; + while( e ) + { + e->prevInSEL = e->prevInAEL; + e->nextInSEL = e->nextInAEL; + e->xcurr = TopX( *e, topY ); + e = e->nextInAEL; + } + + //bubblesort ... + bool isModified = true; + while( isModified && m_SortedEdges ) + { + isModified = false; + e = m_SortedEdges; + while( e->nextInSEL ) + { + TEdge *eNext = e->nextInSEL; + IntPoint pt; + if(e->xcurr > eNext->xcurr) + { + if (!IntersectPoint(*e, *eNext, pt, m_UseFullRange) && e->xcurr > eNext->xcurr +1) + throw clipperException("Intersection error"); + if (pt.Y > botY) + { + pt.Y = botY; + pt.X = TopX(*e, pt.Y); + } + AddIntersectNode( e, eNext, pt ); + SwapPositionsInSEL(e, eNext); + isModified = true; + } + else + e = eNext; + } + if( e->prevInSEL ) e->prevInSEL->nextInSEL = 0; + else break; + } + m_SortedEdges = 0; +} +//------------------------------------------------------------------------------ + +void Clipper::AddIntersectNode(TEdge *e1, TEdge *e2, const IntPoint &pt) +{ + 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 + { + IntersectNode* iNode = m_IntersectNodes; + while(iNode->next && newNode->pt.Y <= iNode->next->pt.Y) + iNode = iNode->next; + newNode->next = iNode->next; + iNode->next = newNode; + } +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessIntersectList() +{ + while( m_IntersectNodes ) + { + IntersectNode* iNode = m_IntersectNodes->next; + { + IntersectEdges( m_IntersectNodes->edge1 , + m_IntersectNodes->edge2 , m_IntersectNodes->pt, ipBoth ); + SwapPositionsInAEL( m_IntersectNodes->edge1 , m_IntersectNodes->edge2 ); + } + delete m_IntersectNodes; + m_IntersectNodes = iNode; + } +} +//------------------------------------------------------------------------------ + +void Clipper::DoMaxima(TEdge *e, long64 topY) +{ + TEdge* eMaxPair = GetMaximaPair(e); + long64 X = e->xtop; + TEdge* eNext = e->nextInAEL; + while( eNext != eMaxPair ) + { + if (!eNext) throw clipperException("DoMaxima error"); + IntersectEdges( e, eNext, IntPoint(X, topY), ipBoth ); + SwapPositionsInAEL(e, eNext); + eNext = e->nextInAEL; + } + if( e->outIdx < 0 && eMaxPair->outIdx < 0 ) + { + DeleteFromAEL( e ); + DeleteFromAEL( eMaxPair ); + } + else if( e->outIdx >= 0 && eMaxPair->outIdx >= 0 ) + { + IntersectEdges( e, eMaxPair, IntPoint(X, topY), ipNone ); + } + else throw clipperException("DoMaxima error"); +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessEdgesAtTopOfScanbeam(const long64 topY) +{ + TEdge* e = m_ActiveEdges; + while( e ) + { + //1. process maxima, treating them as if they're 'bent' horizontal edges, + // but exclude maxima with horizontal edges. nb: e can't be a horizontal. + if( IsMaxima(e, topY) && !NEAR_EQUAL(GetMaximaPair(e)->dx, HORIZONTAL) ) + { + //'e' might be removed from AEL, as may any following edges so ... + TEdge* ePrev = e->prevInAEL; + DoMaxima(e, topY); + if( !ePrev ) e = m_ActiveEdges; + else e = ePrev->nextInAEL; + } + else + { + bool intermediateVert = IsIntermediate(e, topY); + //2. promote horizontal edges, otherwise update xcurr and ycurr ... + if (intermediateVert && NEAR_EQUAL(e->nextInLML->dx, HORIZONTAL) ) + { + if (e->outIdx >= 0) + { + AddOutPt(e, IntPoint(e->xtop, e->ytop)); + + for (HorzJoinList::size_type i = 0; i < m_HorizJoins.size(); ++i) + { + IntPoint pt, pt2; + HorzJoinRec* hj = m_HorizJoins[i]; + if (GetOverlapSegment(IntPoint(hj->edge->xbot, hj->edge->ybot), + IntPoint(hj->edge->xtop, hj->edge->ytop), + IntPoint(e->nextInLML->xbot, e->nextInLML->ybot), + IntPoint(e->nextInLML->xtop, e->nextInLML->ytop), pt, pt2)) + AddJoin(hj->edge, e->nextInLML, hj->savedIdx, e->outIdx); + } + + AddHorzJoin(e->nextInLML, e->outIdx); + } + UpdateEdgeIntoAEL(e); + AddEdgeToSEL(e); + } else + { + e->xcurr = TopX( *e, topY ); + e->ycurr = topY; + + if (m_ForceSimple && e->prevInAEL && + e->prevInAEL->xcurr == e->xcurr && + e->outIdx >= 0 && e->prevInAEL->outIdx >= 0) + { + if (intermediateVert) + AddOutPt(e->prevInAEL, IntPoint(e->xcurr, topY)); + else + AddOutPt(e, IntPoint(e->xcurr, topY)); + } + } + e = e->nextInAEL; + } + } + + //3. Process horizontals at the top of the scanbeam ... + ProcessHorizontals(); + + //4. Promote intermediate vertices ... + e = m_ActiveEdges; + while( e ) + { + if( IsIntermediate( e, topY ) ) + { + if( e->outIdx >= 0 ) AddOutPt(e, IntPoint(e->xtop,e->ytop)); + UpdateEdgeIntoAEL(e); + + //if output polygons share an edge, they'll need joining later ... + TEdge* ePrev = e->prevInAEL; + TEdge* eNext = e->nextInAEL; + if (ePrev && ePrev->xcurr == e->xbot && + ePrev->ycurr == e->ybot && e->outIdx >= 0 && + ePrev->outIdx >= 0 && ePrev->ycurr > ePrev->ytop && + SlopesEqual(*e, *ePrev, m_UseFullRange)) + { + AddOutPt(ePrev, IntPoint(e->xbot, e->ybot)); + AddJoin(e, ePrev); + } + else if (eNext && eNext->xcurr == e->xbot && + eNext->ycurr == e->ybot && e->outIdx >= 0 && + eNext->outIdx >= 0 && eNext->ycurr > eNext->ytop && + SlopesEqual(*e, *eNext, m_UseFullRange)) + { + AddOutPt(eNext, IntPoint(e->xbot, e->ybot)); + AddJoin(e, eNext); + } + } + e = e->nextInAEL; + } +} +//------------------------------------------------------------------------------ + +void Clipper::FixupOutPolygon(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 (;;) + { + if (pp->prev == pp || pp->prev == pp->next ) + { + DisposeOutPts(pp); + outrec.pts = 0; + return; + } + //test for duplicate points and for same slope (cross-product) ... + if ( PointsEqual(pp->pt, pp->next->pt) || + SlopesEqual(pp->prev->pt, pp->pt, pp->next->pt, m_UseFullRange) ) + { + 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; +} +//------------------------------------------------------------------------------ + +void Clipper::BuildResult(Polygons &polys) +{ + polys.reserve(m_PolyOuts.size()); + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + if (m_PolyOuts[i]->pts) + { + Polygon pg; + OutPt* p = m_PolyOuts[i]->pts; + do + { + pg.push_back(p->pt); + p = p->prev; + } while (p != m_PolyOuts[i]->pts); + if (pg.size() > 2) + polys.push_back(pg); + } + } +} +//------------------------------------------------------------------------------ + +int PointCount(OutPt *pts) +{ + if (!pts) return 0; + int result = 0; + OutPt* p = pts; + do + { + result++; + p = p->next; + } + while (p != pts); + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::BuildResult2(PolyTree& polytree) +{ + polytree.Clear(); + polytree.AllNodes.reserve(m_PolyOuts.size()); + //add each output polygon/contour to polytree ... + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) + { + OutRec* outRec = m_PolyOuts[i]; + int cnt = PointCount(outRec->pts); + if (cnt < 3) continue; + FixHoleLinkage(*outRec); + PolyNode* pn = new PolyNode(); + //nb: polytree takes ownership of all the PolyNodes + polytree.AllNodes.push_back(pn); + outRec->polyNode = pn; + pn->Parent = 0; + pn->Index = 0; + pn->Contour.reserve(cnt); + OutPt *op = outRec->pts; + for (int j = 0; j < cnt; j++) + { + pn->Contour.push_back(op->pt); + op = op->prev; + } + } + + //fixup PolyNode links etc ... + polytree.Childs.reserve(m_PolyOuts.size()); + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) + { + OutRec* outRec = m_PolyOuts[i]; + if (!outRec->polyNode) continue; + if (outRec->FirstLeft) + outRec->FirstLeft->polyNode->AddChild(*outRec->polyNode); + else + polytree.AddChild(*outRec->polyNode); + } +} +//------------------------------------------------------------------------------ + +void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) +{ + //just swap the contents (because fIntersectNodes is a single-linked-list) + IntersectNode inode = int1; //gets a copy of Int1 + int1.edge1 = int2.edge1; + int1.edge2 = int2.edge2; + int1.pt = int2.pt; + int2.edge1 = inode.edge1; + int2.edge2 = inode.edge2; + int2.pt = inode.pt; +} +//------------------------------------------------------------------------------ + +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; +} +//------------------------------------------------------------------------------ + +bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) +{ + if (e2.xcurr == e1.xcurr) + { + if (e2.ytop > e1.ytop) + return e2.xtop < TopX(e1, e2.ytop); + else return e1.xtop > TopX(e2, e1.ytop); + } + else return e2.xcurr < e1.xcurr; +} +//------------------------------------------------------------------------------ + +void Clipper::InsertEdgeIntoAEL(TEdge *edge) +{ + edge->prevInAEL = 0; + edge->nextInAEL = 0; + if( !m_ActiveEdges ) + { + m_ActiveEdges = edge; + } + else if( E2InsertsBeforeE1(*m_ActiveEdges, *edge) ) + { + edge->nextInAEL = m_ActiveEdges; + m_ActiveEdges->prevInAEL = edge; + m_ActiveEdges = edge; + } else + { + TEdge* e = m_ActiveEdges; + while( e->nextInAEL && !E2InsertsBeforeE1(*e->nextInAEL , *edge) ) + e = e->nextInAEL; + edge->nextInAEL = e->nextInAEL; + if( e->nextInAEL ) e->nextInAEL->prevInAEL = edge; + edge->prevInAEL = e; + e->nextInAEL = edge; + } +} +//---------------------------------------------------------------------- + +bool Clipper::JoinPoints(const JoinRec *j, OutPt *&p1, OutPt *&p2) +{ + OutRec *outRec1 = m_PolyOuts[j->poly1Idx]; + OutRec *outRec2 = m_PolyOuts[j->poly2Idx]; + if (!outRec1 || !outRec2) return false; + OutPt *pp1a = outRec1->pts; + OutPt *pp2a = outRec2->pts; + IntPoint pt1 = j->pt2a, pt2 = j->pt2b; + IntPoint pt3 = j->pt1a, pt4 = j->pt1b; + if (!FindSegment(pp1a, m_UseFullRange, pt1, pt2)) return false; + if (outRec1 == outRec2) + { + //we're searching the same polygon for overlapping segments so + //segment 2 mustn't be the same as segment 1 ... + pp2a = pp1a->next; + if (!FindSegment(pp2a, m_UseFullRange, pt3, pt4) || (pp2a == pp1a)) + return false; + } + else if (!FindSegment(pp2a, m_UseFullRange, pt3, pt4)) return false; + + if (!GetOverlapSegment(pt1, pt2, pt3, pt4, pt1, pt2)) return false; + + OutPt *p3, *p4, *prev = pp1a->prev; + //get p1 & p2 polypts - the overlap start & endpoints on poly1 + if (PointsEqual(pp1a->pt, pt1)) p1 = pp1a; + else if (PointsEqual(prev->pt, pt1)) p1 = prev; + else p1 = InsertPolyPtBetween(pp1a, prev, pt1); + + if (PointsEqual(pp1a->pt, pt2)) p2 = pp1a; + else if (PointsEqual(prev->pt, pt2)) p2 = prev; + else if ((p1 == pp1a) || (p1 == prev)) + p2 = InsertPolyPtBetween(pp1a, prev, pt2); + else if (Pt3IsBetweenPt1AndPt2(pp1a->pt, p1->pt, pt2)) + p2 = InsertPolyPtBetween(pp1a, p1, pt2); else + p2 = InsertPolyPtBetween(p1, prev, pt2); + + //get p3 & p4 polypts - the overlap start & endpoints on poly2 + prev = pp2a->prev; + if (PointsEqual(pp2a->pt, pt1)) p3 = pp2a; + else if (PointsEqual(prev->pt, pt1)) p3 = prev; + else p3 = InsertPolyPtBetween(pp2a, prev, pt1); + + if (PointsEqual(pp2a->pt, pt2)) p4 = pp2a; + else if (PointsEqual(prev->pt, pt2)) p4 = prev; + else if ((p3 == pp2a) || (p3 == prev)) + p4 = InsertPolyPtBetween(pp2a, prev, pt2); + else if (Pt3IsBetweenPt1AndPt2(pp2a->pt, p3->pt, pt2)) + p4 = InsertPolyPtBetween(pp2a, p3, pt2); else + p4 = InsertPolyPtBetween(p3, prev, pt2); + + //p1.pt == p3.pt and p2.pt == p4.pt so join p1 to p3 and p2 to p4 ... + if (p1->next == p2 && p3->prev == p4) + { + p1->next = p3; + p3->prev = p1; + p2->prev = p4; + p4->next = p2; + return true; + } + else if (p1->prev == p2 && p3->next == p4) + { + p1->prev = p3; + p3->next = p1; + p2->next = p4; + p4->prev = p2; + return true; + } + else + return false; //an orientation is probably wrong +} +//---------------------------------------------------------------------- + +void Clipper::FixupJoinRecs(JoinRec *j, OutPt *pt, unsigned startIdx) +{ + for (JoinList::size_type k = startIdx; k < m_Joins.size(); k++) + { + JoinRec* j2 = m_Joins[k]; + if (j2->poly1Idx == j->poly1Idx && PointIsVertex(j2->pt1a, pt)) + j2->poly1Idx = j->poly2Idx; + if (j2->poly2Idx == j->poly1Idx && PointIsVertex(j2->pt2a, pt)) + j2->poly2Idx = j->poly2Idx; + } +} +//---------------------------------------------------------------------- + +bool Poly2ContainsPoly1(OutPt* outPt1, OutPt* outPt2, bool UseFullInt64Range) +{ + 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); +} +//---------------------------------------------------------------------- + +void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) +{ + + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + if (outRec->pts && outRec->FirstLeft == OldOutRec) + { + if (Poly2ContainsPoly1(outRec->pts, NewOutRec->pts, m_UseFullRange)) + outRec->FirstLeft = NewOutRec; + } + } +} +//---------------------------------------------------------------------- + +void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) +{ + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + if (outRec->FirstLeft == OldOutRec) outRec->FirstLeft = NewOutRec; + } +} +//---------------------------------------------------------------------- + +void Clipper::JoinCommonEdges() +{ + for (JoinList::size_type i = 0; i < m_Joins.size(); i++) + { + JoinRec* j = m_Joins[i]; + + OutRec *outRec1 = GetOutRec(j->poly1Idx); + OutRec *outRec2 = GetOutRec(j->poly2Idx); + + if (!outRec1->pts || !outRec2->pts) continue; + + //get the polygon fragment with the correct hole state (FirstLeft) + //before calling JoinPoints() ... + OutRec *holeStateRec; + if (outRec1 == outRec2) holeStateRec = outRec1; + else if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2; + else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1; + else holeStateRec = GetLowermostRec(outRec1, outRec2); + + OutPt *p1, *p2; + if (!JoinPoints(j, p1, p2)) 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->bottomPt = 0; + outRec2 = CreateOutRec(); + outRec2->pts = p2; + + if (Poly2ContainsPoly1(outRec2->pts, outRec1->pts, m_UseFullRange)) + { + //outRec2 is contained by outRec1 ... + outRec2->isHole = !outRec1->isHole; + outRec2->FirstLeft = outRec1; + + FixupJoinRecs(j, p2, i+1); + + //fixup FirstLeft pointers that may need reassigning to OutRec1 + if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); + + FixupOutPolygon(*outRec1); //nb: do this BEFORE testing orientation + FixupOutPolygon(*outRec2); // but AFTER calling FixupJoinRecs() + + + if ((outRec2->isHole ^ m_ReverseOutput) == (Area(*outRec2, m_UseFullRange) > 0)) + ReversePolyPtLinks(outRec2->pts); + + } else if (Poly2ContainsPoly1(outRec1->pts, outRec2->pts, m_UseFullRange)) + { + //outRec1 is contained by outRec2 ... + outRec2->isHole = outRec1->isHole; + outRec1->isHole = !outRec2->isHole; + outRec2->FirstLeft = outRec1->FirstLeft; + outRec1->FirstLeft = outRec2; + + FixupJoinRecs(j, p2, i+1); + + //fixup FirstLeft pointers that may need reassigning to OutRec1 + if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); + + FixupOutPolygon(*outRec1); //nb: do this BEFORE testing orientation + FixupOutPolygon(*outRec2); // but AFTER calling FixupJoinRecs() + + if ((outRec1->isHole ^ m_ReverseOutput) == (Area(*outRec1, m_UseFullRange) > 0)) + ReversePolyPtLinks(outRec1->pts); + } + else + { + //the 2 polygons are completely separate ... + outRec2->isHole = outRec1->isHole; + outRec2->FirstLeft = outRec1->FirstLeft; + + FixupJoinRecs(j, p2, i+1); + + //fixup FirstLeft pointers that may need reassigning to OutRec2 + if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); + + FixupOutPolygon(*outRec1); //nb: do this BEFORE testing orientation + FixupOutPolygon(*outRec2); // but AFTER calling FixupJoinRecs() + } + + } else + { + //joined 2 polygons together ... + + //cleanup redundant edges ... + FixupOutPolygon(*outRec1); + + outRec2->pts = 0; + outRec2->bottomPt = 0; + outRec2->idx = outRec1->idx; + + outRec1->isHole = holeStateRec->isHole; + if (holeStateRec == outRec2) + outRec1->FirstLeft = outRec2->FirstLeft; + outRec2->FirstLeft = outRec1; + + //fixup FirstLeft pointers that may need reassigning to OutRec1 + if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); + } + } +} +//------------------------------------------------------------------------------ + +inline void UpdateOutPtIdxs(OutRec& outrec) +{ + OutPt* op = outrec.pts; + do + { + op->idx = outrec.idx; + op = op->prev; + } + while(op != outrec.pts); +} +//------------------------------------------------------------------------------ + +void Clipper::DoSimplePolygons() +{ + 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 (PointsEqual(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, 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); + } +} +//------------------------------------------------------------------------------ + +void ReversePolygon(Polygon& p) +{ + std::reverse(p.begin(), p.end()); +} +//------------------------------------------------------------------------------ + +void ReversePolygons(Polygons& p) +{ + for (Polygons::size_type i = 0; i < p.size(); ++i) + ReversePolygon(p[i]); +} + +//------------------------------------------------------------------------------ +// OffsetPolygon functions ... +//------------------------------------------------------------------------------ + +struct DoublePoint +{ + double X; + double Y; + DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} +}; +//------------------------------------------------------------------------------ + +Polygon BuildArc(const IntPoint &pt, + const double a1, const double a2, const double r, double limit) +{ + //see notes in clipper.pas regarding steps + double arcFrac = std::fabs(a2 - a1) / (2 * pi); + int steps = (int)(arcFrac * pi / std::acos(1 - limit / std::fabs(r))); + if (steps < 2) steps = 2; + else if (steps > (int)(222.0 * arcFrac)) steps = (int)(222.0 * arcFrac); + + double x = std::cos(a1); + double y = std::sin(a1); + double c = std::cos((a2 - a1) / steps); + double s = std::sin((a2 - a1) / steps); + Polygon result(steps +1); + for (int i = 0; i <= steps; ++i) + { + result[i].X = pt.X + Round(x * r); + result[i].Y = pt.Y + Round(y * r); + double x2 = x; + x = x * c - s * y; //cross product + y = x2 * s + y * c; //dot product + } + return result; +} +//------------------------------------------------------------------------------ + +DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) +{ + if(pt2.X == pt1.X && pt2.Y == pt1.Y) + return DoublePoint(0, 0); + + 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); +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +class PolyOffsetBuilder +{ +private: + Polygons m_p; + Polygon* m_curr_poly; + std::vector normals; + double m_delta, m_RMin, m_R; + size_t m_i, m_j, m_k; + static const int buffLength = 128; + JoinType m_jointype; + +public: + +PolyOffsetBuilder(const Polygons& in_polys, Polygons& out_polys, + double delta, JoinType jointype, double limit, bool autoFix) +{ + //nb precondition - out_polys != ptsin_polys + if (NEAR_ZERO(delta)) + { + out_polys = in_polys; + return; + } + + this->m_p = in_polys; + this->m_delta = delta; + this->m_jointype = jointype; + + //ChecksInput - fixes polygon orientation if necessary and removes + //duplicate vertices. Can be set false when you're sure that polygon + //orientation is correct and that there are no duplicate vertices. + if (autoFix) + { + size_t Len = m_p.size(), botI = 0; + while (botI < Len && m_p[botI].empty()) botI++; + if (botI == Len) return; + + //botPt: used to find the lowermost (in inverted Y-axis) & leftmost point + //This point (on m_p[botI]) must be on an outer polygon ring and if + //its orientation is false (counterclockwise) then assume all polygons + //need reversing ... + IntPoint botPt = m_p[botI][0]; + for (size_t i = botI; i < Len; ++i) + { + if (m_p[i].size() < 3) continue; + if (UpdateBotPt(m_p[i][0], botPt)) botI = i; + Polygon::iterator it = m_p[i].begin() +1; + while (it != m_p[i].end()) + { + if (PointsEqual(*it, *(it -1))) + it = m_p[i].erase(it); + else + { + if (UpdateBotPt(*it, botPt)) botI = i; + ++it; + } + } + } + if (!Orientation(m_p[botI])) + ReversePolygons(m_p); + } + + switch (jointype) + { + case jtRound: + if (limit <= 0) limit = 0.25; + else if (limit > std::fabs(delta)) limit = std::fabs(delta); + break; + case jtMiter: + if (limit < 2) limit = 2; + break; + default: //unused + limit = 1; + } + m_RMin = 2.0/(limit*limit); + + double deltaSq = delta*delta; + out_polys.clear(); + out_polys.resize(m_p.size()); + for (m_i = 0; m_i < m_p.size(); m_i++) + { + m_curr_poly = &out_polys[m_i]; + size_t len = m_p[m_i].size(); + if (len > 1 && m_p[m_i][0].X == m_p[m_i][len - 1].X && + m_p[m_i][0].Y == m_p[m_i][len-1].Y) len--; + + //when 'shrinking' polygons - to minimize artefacts + //strip those polygons that have an area < pi * delta^2 ... + double a1 = Area(m_p[m_i]); + if (delta < 0) { if (a1 > 0 && a1 < deltaSq *pi) len = 0; } + else if (a1 < 0 && -a1 < deltaSq *pi) len = 0; //holes have neg. area + + if (len == 0 || (len < 3 && delta <= 0)) + continue; + else if (len == 1) + { + Polygon arc; + arc = BuildArc(m_p[m_i][len-1], 0, 2 * pi, delta, limit); + out_polys[m_i] = arc; + continue; + } + + //build normals ... + normals.clear(); + normals.resize(len); + normals[len-1] = GetUnitNormal(m_p[m_i][len-1], m_p[m_i][0]); + 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]); + + m_k = len -1; + for (m_j = 0; m_j < len; ++m_j) + { + switch (jointype) + { + case jtMiter: + { + m_R = 1 + (normals[m_j].X*normals[m_k].X + + normals[m_j].Y*normals[m_k].Y); + if (m_R >= m_RMin) DoMiter(); else DoSquare(limit); + break; + } + case jtSquare: DoSquare(1.0); break; + case jtRound: DoRound(limit); break; + } + m_k = m_j; + } + } + + //finally, clean up untidy corners using Clipper ... + Clipper clpr; + clpr.AddPolygons(out_polys, ptSubject); + if (delta > 0) + { + if (!clpr.Execute(ctUnion, out_polys, pftPositive, pftPositive)) + out_polys.clear(); + } + else + { + IntRect r = clpr.GetBounds(); + Polygon 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.AddPolygon(outer, ptSubject); + if (clpr.Execute(ctUnion, out_polys, pftNegative, pftNegative)) + { + out_polys.erase(out_polys.begin()); + ReversePolygons(out_polys); + + } else + out_polys.clear(); + } +} +//------------------------------------------------------------------------------ + +private: + +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); +} +//------------------------------------------------------------------------------ + +void DoSquare(double mul) +{ + IntPoint pt1 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_k].X * m_delta), + (long64)Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)); + IntPoint pt2 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta), + (long64)Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)); + if ((normals[m_k].X * normals[m_j].Y - normals[m_j].X * normals[m_k].Y) * m_delta >= 0) + { + double a1 = std::atan2(normals[m_k].Y, normals[m_k].X); + double a2 = std::atan2(-normals[m_j].Y, -normals[m_j].X); + a1 = std::fabs(a2 - a1); + if (a1 > pi) a1 = pi * 2 - a1; + double dx = std::tan((pi - a1) / 4) * std::fabs(m_delta * mul); + pt1 = IntPoint((long64)(pt1.X -normals[m_k].Y * dx), + (long64)(pt1.Y + normals[m_k].X * dx)); + AddPoint(pt1); + pt2 = IntPoint((long64)(pt2.X + normals[m_j].Y * dx), + (long64)(pt2.Y -normals[m_j].X * dx)); + AddPoint(pt2); + } + else + { + AddPoint(pt1); + AddPoint(m_p[m_i][m_j]); + AddPoint(pt2); + } +} +//------------------------------------------------------------------------------ + +void DoMiter() +{ + if ((normals[m_k].X * normals[m_j].Y - normals[m_j].X * normals[m_k].Y) * m_delta >= 0) + { + double q = m_delta / m_R; + AddPoint(IntPoint((long64)Round(m_p[m_i][m_j].X + + (normals[m_k].X + normals[m_j].X) * q), + (long64)Round(m_p[m_i][m_j].Y + (normals[m_k].Y + normals[m_j].Y) * q))); + } + else + { + IntPoint pt1 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_k].X * + m_delta), (long64)Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)); + IntPoint pt2 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_j].X * + m_delta), (long64)Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)); + AddPoint(pt1); + AddPoint(m_p[m_i][m_j]); + AddPoint(pt2); + } +} +//------------------------------------------------------------------------------ + +void DoRound(double limit) +{ + IntPoint pt1 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_k].X * m_delta), + (long64)Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)); + IntPoint pt2 = IntPoint((long64)Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta), + (long64)Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)); + AddPoint(pt1); + //round off reflex angles (ie > 180 deg) unless almost flat (ie < ~10deg). + if ((normals[m_k].X*normals[m_j].Y - normals[m_j].X*normals[m_k].Y) * m_delta >= 0) + { + if (normals[m_j].X * normals[m_k].X + normals[m_j].Y * normals[m_k].Y < 0.985) + { + double a1 = std::atan2(normals[m_k].Y, normals[m_k].X); + double a2 = std::atan2(normals[m_j].Y, normals[m_j].X); + if (m_delta > 0 && a2 < a1) a2 += pi *2; + else if (m_delta < 0 && a2 > a1) a2 -= pi *2; + Polygon arc = BuildArc(m_p[m_i][m_j], a1, a2, m_delta, limit); + for (Polygon::size_type m = 0; m < arc.size(); m++) + AddPoint(arc[m]); + } + } + else + AddPoint(m_p[m_i][m_j]); + AddPoint(pt2); +} +//-------------------------------------------------------------------------- + +bool UpdateBotPt(const IntPoint &pt, IntPoint &botPt) +{ + if (pt.Y > botPt.Y || (pt.Y == botPt.Y && pt.X < botPt.X)) + { + botPt = pt; + return true; + } + else return false; +} +//-------------------------------------------------------------------------- + +}; //end PolyOffsetBuilder + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +void OffsetPolygons(const Polygons &in_polys, Polygons &out_polys, + double delta, JoinType jointype, double limit, bool autoFix) +{ + if (&out_polys == &in_polys) + { + Polygons poly2(in_polys); + PolyOffsetBuilder(poly2, out_polys, delta, jointype, limit, autoFix); + } + else PolyOffsetBuilder(in_polys, out_polys, delta, jointype, limit, autoFix); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygon(const Polygon &in_poly, Polygons &out_polys, PolyFillType fillType) +{ + Clipper c; + c.ForceSimple(true); + c.AddPolygon(in_poly, ptSubject); + c.Execute(ctUnion, out_polys, fillType, fillType); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygons(const Polygons &in_polys, Polygons &out_polys, PolyFillType fillType) +{ + Clipper c; + c.ForceSimple(true); + c.AddPolygons(in_polys, ptSubject); + c.Execute(ctUnion, out_polys, fillType, fillType); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygons(Polygons &polys, PolyFillType fillType) +{ + SimplifyPolygons(polys, polys, fillType); +} +//------------------------------------------------------------------------------ + +inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) +{ + 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 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); +} +//------------------------------------------------------------------------------ + +bool SlopesNearColinear(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; +} +//------------------------------------------------------------------------------ + +bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) +{ + double dx = (double)pt1.X - pt2.X; + double dy = (double)pt1.Y - pt2.Y; + return ((dx * dx) + (dy * dy) <= distSqrd); +} +//------------------------------------------------------------------------------ + +void CleanPolygon(Polygon& in_poly, Polygon& 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; } + + out_poly.resize(highI + 1); + IntPoint pt = in_poly[highI]; + int i = 0, k = 0; + for (;;) + { + 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) || + SlopesNearColinear(pt, in_poly[i], in_poly[+1], distSqrd)) i++; + if (i >= highI) break; + else if (i != i2) continue; + pt = in_poly[i++]; + out_poly[k++] = pt; + } + if (i <= highI) out_poly[k++] = in_poly[i]; + if (k > 2 && SlopesNearColinear(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); +} +//------------------------------------------------------------------------------ + +void CleanPolygons(Polygons& in_polys, Polygons& out_polys, double distance) +{ + for (Polygons::size_type i = 0; i < in_polys.size(); ++i) + CleanPolygon(in_polys[i], out_polys[i], distance); +} +//------------------------------------------------------------------------------ + +void AddPolyNodeToPolygons(PolyNode& polynode, Polygons& polygons) +{ + if (!polynode.Contour.empty()) + polygons.push_back(polynode.Contour); + for (int i = 0; i < polynode.ChildCount(); ++i) + AddPolyNodeToPolygons(*polynode.Childs[i], polygons); +} +//------------------------------------------------------------------------------ + +void PolyTreeToPolygons(PolyTree& polytree, Polygons& polygons) +{ + polygons.resize(0); + polygons.reserve(polytree.Total()); + AddPolyNodeToPolygons(polytree, polygons); +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, IntPoint& p) +{ + s << p.X << ' ' << p.Y << "\n"; + return s; +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, Polygon &p) +{ + for (Polygon::size_type i = 0; i < p.size(); i++) + s << p[i]; + s << "\n"; + return s; +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, Polygons &p) +{ + for (Polygons::size_type i = 0; i < p.size(); i++) + s << p[i]; + s << "\n"; + return s; +} +//------------------------------------------------------------------------------ + +} //ClipperLib namespace diff --git a/include/build.py b/include/build.py index 02d3d0032..6fed90d9b 100644 --- a/include/build.py +++ b/include/build.py @@ -9,6 +9,9 @@ subdirs = ['','svg','wkt','grid','json','util','text_placements','formatting'] if env['SVG_RENDERER']: subdirs.append('svg/output') +if env['GRID_RENDERER']: + subdirs.append('grid') + if 'install' in COMMAND_LINE_TARGETS: for subdir in subdirs: pathdir = os.path.join(base,subdir,'*.hpp') diff --git a/include/mapnik/agg_helpers.hpp b/include/mapnik/agg_helpers.hpp index c96c75a02..100847e7f 100644 --- a/include/mapnik/agg_helpers.hpp +++ b/include/mapnik/agg_helpers.hpp @@ -25,17 +25,12 @@ // mapnik #include -#include +#include // for line_cap_e, line_join_e, etc + // agg -#include "agg_basics.h" -#include "agg_gamma_functions.h" -#include "agg_math_stroke.h" -#include "agg_pixfmt_rgba.h" -#include "agg_scanline_u.h" -#include "agg_scanline_p.h" -#include "agg_renderer_outline_aa.h" -#include "agg_renderer_scanline.h" +#include "agg_gamma_functions.h" // for gamma_power, gamma_linear, etc +#include "agg_math_stroke.h" // for line_join_e::miter_join, etc #include "agg_rasterizer_outline_aa.h" namespace mapnik { diff --git a/include/mapnik/agg_renderer.hpp b/include/mapnik/agg_renderer.hpp index b40a65658..be248ea94 100644 --- a/include/mapnik/agg_renderer.hpp +++ b/include/mapnik/agg_renderer.hpp @@ -34,6 +34,7 @@ #include // for CoordTransform #include // for composite_mode_e #include +#include // boost #include @@ -69,6 +70,8 @@ public: // create with external placement detector, possibly non-empty agg_renderer(Map const &m, T & pixmap, boost::shared_ptr detector, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + // pass in mapnik::request object to provide the mutable things per render + agg_renderer(Map const& m, request const& req, T & pixmap, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); ~agg_renderer(); void start_map_processing(Map const& map); void end_map_processing(Map const& map); @@ -129,6 +132,11 @@ public: return DEFAULT; } + inline double scale_factor() const + { + return scale_factor_; + } + protected: template void debug_draw_box(R& buf, box2d const& extent, @@ -151,6 +159,8 @@ private: boost::shared_ptr detector_; boost::scoped_ptr ras_ptr; box2d query_extent_; + gamma_method_e gamma_method_; + double gamma_; void setup(Map const& m); }; } diff --git a/include/mapnik/attribute_collector.hpp b/include/mapnik/attribute_collector.hpp index f97e5d23b..bc70dd459 100644 --- a/include/mapnik/attribute_collector.hpp +++ b/include/mapnik/attribute_collector.hpp @@ -47,7 +47,6 @@ #include // for text_placements // boost -#include #include #include @@ -62,12 +61,11 @@ struct expression_attributes : boost::static_visitor explicit expression_attributes(Container& names) : names_(names) {} - void operator() (value_type const& x) const + void operator() (value_type const& /*x*/) const { - boost::ignore_unused_variable_warning(x); } - void operator() (geometry_type_attribute const& type) const + void operator() (geometry_type_attribute const& /*type*/) const { // do nothing } @@ -107,8 +105,11 @@ private: struct symbolizer_attributes : public boost::static_visitor<> { - symbolizer_attributes(std::set& names) - : names_(names), f_attr(names) {} + symbolizer_attributes(std::set& names, + double & filter_factor) + : names_(names), + filter_factor_(filter_factor), + f_attr(names) {} template void operator () (T const&) const {} @@ -199,6 +200,11 @@ struct symbolizer_attributes : public boost::static_visitor<> { boost::apply_visitor(f_attr,*width_expr); } + path_expression_ptr const& filename_expr = sym.get_filename(); + if (filename_expr) + { + path_processor_type::collect_attributes(*filename_expr,names_); + } collect_transform(sym.get_image_transform()); collect_transform(sym.get_transform()); } @@ -212,10 +218,15 @@ struct symbolizer_attributes : public boost::static_visitor<> } collect_transform(sym.get_transform()); } - // TODO - support remaining syms + + void operator () (raster_symbolizer const& sym) + { + filter_factor_ = sym.calculate_filter_factor(); + } private: std::set& names_; + double & filter_factor_; expression_attributes > f_attr; void collect_transform(transform_list_ptr const& trans_expr) { @@ -231,18 +242,20 @@ class attribute_collector : public mapnik::noncopyable { private: std::set& names_; + double filter_factor_; expression_attributes > f_attr; public: attribute_collector(std::set& names) - : names_(names), f_attr(names) {} - + : names_(names), + filter_factor_(1.0), + f_attr(names) {} template void operator() (RuleType const& r) { typename RuleType::symbolizers const& symbols = r.get_symbolizers(); typename RuleType::symbolizers::const_iterator symIter=symbols.begin(); - symbolizer_attributes s_attr(names_); + symbolizer_attributes s_attr(names_,filter_factor_); while (symIter != symbols.end()) { boost::apply_visitor(s_attr,*symIter++); @@ -251,22 +264,11 @@ public: expression_ptr const& expr = r.get_filter(); boost::apply_visitor(f_attr,*expr); } -}; -struct directive_collector : public boost::static_visitor<> -{ - directive_collector(double & filter_factor) - : filter_factor_(filter_factor) {} - - template - void operator () (T const&) const {} - - void operator () (raster_symbolizer const& sym) + double get_filter_factor() const { - filter_factor_ = sym.calculate_filter_factor(); + return filter_factor_; } -private: - double & filter_factor_; }; } // namespace mapnik diff --git a/include/mapnik/boolean.hpp b/include/mapnik/boolean.hpp index 333152c9b..99255be1a 100644 --- a/include/mapnik/boolean.hpp +++ b/include/mapnik/boolean.hpp @@ -38,7 +38,7 @@ public: : b_(false) {} boolean(bool b) : b_(b) {} - explicit boolean(boolean const& b) + boolean(boolean const& b) : b_(b.b_) {} operator bool() const diff --git a/include/mapnik/box2d.hpp b/include/mapnik/box2d.hpp index 6688fa94f..41909e677 100644 --- a/include/mapnik/box2d.hpp +++ b/include/mapnik/box2d.hpp @@ -67,6 +67,10 @@ public: T miny() const; T maxx() const; T maxy() const; + void set_minx(T v); + void set_miny(T v); + void set_maxx(T v); + void set_maxy(T v); T width() const; T height() const; void width(T w); diff --git a/include/mapnik/cairo_context.hpp b/include/mapnik/cairo_context.hpp index 3d35fea64..369edaf94 100644 --- a/include/mapnik/cairo_context.hpp +++ b/include/mapnik/cairo_context.hpp @@ -25,35 +25,41 @@ #define MAPNIK_CAIRO_CONTEXT_HPP // mapnik +#include #include #include #include #include #include #include -#include -#include -#include #include +#include +#include + // boost -#include #include + // cairo #include -#include + // stl -#include +#include +#include +#include + // agg #include "agg_basics.h" namespace mapnik { +class text_path; + typedef cairo_status_t ErrorStatus; /// Throws the appropriate exception, if exceptions are enabled. inline void throw_exception(ErrorStatus status) { - throw std::runtime_error("cairo: fixme"); + throw std::runtime_error(std::string("cairo: ") + cairo_status_to_string(status)); } //We inline this because it is called so often. @@ -64,7 +70,7 @@ inline void check_status_and_throw_exception(ErrorStatus status) } template -void check_object_status_and_throw_exception(const T& object) +void check_object_status_and_throw_exception(T const& object) { check_status_and_throw_exception(object.get_status()); } @@ -72,23 +78,9 @@ void check_object_status_and_throw_exception(const T& object) class cairo_face : private mapnik::noncopyable { public: - cairo_face(boost::shared_ptr const& engine, face_ptr const& face) - : face_(face) - { - static cairo_user_data_key_t key; - c_face_ = cairo_ft_font_face_create_for_ft_face(face->get_face(), FT_LOAD_NO_HINTING); - cairo_font_face_set_user_data(c_face_, &key, new handle(engine, face), destroy); - } - ~cairo_face() - { - if (c_face_) cairo_font_face_destroy(c_face_); - } - - cairo_font_face_t * face() const - { - return c_face_; - } - + cairo_face(boost::shared_ptr const& engine, face_ptr const& face); + ~cairo_face(); + cairo_font_face_t * face() const; private: class handle { @@ -315,7 +307,7 @@ public: void fill(); void paint(); void set_pattern(cairo_pattern const& pattern); - void set_gradient(cairo_gradient const& pattern, const box2d &bbox); + void set_gradient(cairo_gradient const& pattern, box2d 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 set_font_face(cairo_face_manager & manager, face_ptr face); diff --git a/include/mapnik/cairo_renderer.hpp b/include/mapnik/cairo_renderer.hpp index 3e958b1c1..c2278231d 100644 --- a/include/mapnik/cairo_renderer.hpp +++ b/include/mapnik/cairo_renderer.hpp @@ -31,9 +31,11 @@ #include #include #include +#include #include // for all symbolizers #include #include +#include // cairo #include @@ -41,10 +43,6 @@ // boost #include -// FIXME -// forward declare so that -// apps using mapnik do not -// need agg headers namespace agg { struct trans_affine; } @@ -56,8 +54,23 @@ class marker; class MAPNIK_DECL cairo_renderer_base : private mapnik::noncopyable { protected: - cairo_renderer_base(Map const& m, cairo_ptr const& cairo, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); - cairo_renderer_base(Map const& m, cairo_ptr const& cairo, boost::shared_ptr detector, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + cairo_renderer_base(Map const& m, + cairo_ptr const& cairo, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer_base(Map const& m, + request const& req, + cairo_ptr const& cairo, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer_base(Map const& m, + cairo_ptr const& cairo, + boost::shared_ptr detector, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); public: ~cairo_renderer_base(); void start_map_processing(Map const& map); @@ -112,10 +125,18 @@ public: return DEFAULT; } - void render_marker(pixel_position const& pos, marker const& marker, const agg::trans_affine & mtx, double opacity=1.0, bool recenter=true); + inline double scale_factor() const + { + return scale_factor_; + } + + void render_marker(pixel_position const& pos, + marker const& marker, + agg::trans_affine const& mtx, + double opacity=1.0, + bool recenter=true); void render_box(box2d const& b); protected: - Map const& m_; cairo_context context_; unsigned width_; @@ -136,8 +157,23 @@ class MAPNIK_DECL cairo_renderer : public feature_style_processor detector, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + cairo_renderer(Map const& m, + T const& obj, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer(Map const& m, + request const& req, + T const& obj, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer(Map const& m, + T const& obj, + boost::shared_ptr detector, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); void end_map_processing(Map const& map); }; } diff --git a/include/mapnik/char_info.hpp b/include/mapnik/char_info.hpp index 12da2bf31..e5a6a5baa 100644 --- a/include/mapnik/char_info.hpp +++ b/include/mapnik/char_info.hpp @@ -20,15 +20,16 @@ * *****************************************************************************/ -#ifndef CHAR_INFO_HPP -#define CHAR_INFO_HPP +#ifndef MAPNIK_CHAR_INFO_HPP +#define MAPNIK_CHAR_INFO_HPP #include namespace mapnik { struct char_properties; -class char_info { +class char_info +{ public: char_info(unsigned c_, double width_, double ymax_, double ymin_, double line_height_) : c(c_), @@ -36,7 +37,7 @@ public: line_height(line_height_), ymin(ymin_), ymax(ymax_), - avg_height(ymax_-ymin_), + avg_height(ymax - ymin), format() { } @@ -52,6 +53,8 @@ public: { } + double height() const { return ymax-ymin; } + unsigned c; double width; double line_height; @@ -59,7 +62,8 @@ public: double ymax; double avg_height; char_properties *format; - double height() const { return ymax-ymin; } + }; } -#endif + +#endif //MAPNIK_CHAR_INFO_HPP diff --git a/include/mapnik/config.hpp b/include/mapnik/config.hpp index 88399b19c..6e4fe6858 100644 --- a/include/mapnik/config.hpp +++ b/include/mapnik/config.hpp @@ -39,9 +39,15 @@ # pragma warning(disable : 4996) //_CRT_SECURE_NO_DEPRECATE # endif #else +# if __GNUC__ >= 4 +# define MAPNIK_EXP __attribute__ ((visibility ("default"))) +# define MAPNIK_DECL __attribute__ ((visibility ("default"))) +# define MAPNIK_IMP __attribute__ ((visibility ("default"))) +# else # define MAPNIK_EXP -# define MAPNIK_IMP # define MAPNIK_DECL +# define MAPNIK_IMP +# endif #endif #define PROJ_ENVELOPE_POINTS 20 diff --git a/include/mapnik/config_error.hpp b/include/mapnik/config_error.hpp index c37d5617c..6f590b806 100644 --- a/include/mapnik/config_error.hpp +++ b/include/mapnik/config_error.hpp @@ -23,6 +23,8 @@ #ifndef MAPNIK_CONFIG_ERROR_HPP #define MAPNIK_CONFIG_ERROR_HPP +#include + #include #include diff --git a/include/mapnik/css_color_grammar_def.hpp b/include/mapnik/css_color_grammar_impl.hpp similarity index 95% rename from include/mapnik/css_color_grammar_def.hpp rename to include/mapnik/css_color_grammar_impl.hpp index 028411ba1..5b37f8761 100644 --- a/include/mapnik/css_color_grammar_def.hpp +++ b/include/mapnik/css_color_grammar_impl.hpp @@ -20,8 +20,8 @@ * *****************************************************************************/ -#ifndef MAPNIK_CSS_COLOR_GRAMMAR_DEF_HPP -#define MAPNIK_CSS_COLOR_GRAMMAR_DEF_HPP +// NOTE: This is an implementation header file and is only meant to be included +// from implementation files. It therefore doesn't have an include guard. // boost #include @@ -100,5 +100,3 @@ css_color_grammar::css_color_grammar() } #endif - -#endif diff --git a/include/mapnik/datasource.hpp b/include/mapnik/datasource.hpp index d9131b233..349d7ab71 100644 --- a/include/mapnik/datasource.hpp +++ b/include/mapnik/datasource.hpp @@ -47,7 +47,7 @@ struct MAPNIK_DECL Featureset : private mapnik::noncopyable virtual ~Featureset() {} }; -typedef MAPNIK_DECL boost::shared_ptr featureset_ptr; +typedef boost::shared_ptr featureset_ptr; class MAPNIK_DECL datasource_exception : public std::exception { @@ -99,6 +99,11 @@ public: return params_; } + parameters & params() + { + return params_; + } + /*! * @brief Get the type of the datasource * @return The type of the datasource (Vector or Raster) @@ -129,19 +134,23 @@ public: typedef boost::shared_ptr datasource_ptr; -#define DATASOURCE_PLUGIN(classname) \ - extern "C" MAPNIK_EXP const char * datasource_name() \ - { \ - return classname::name(); \ - } \ - extern "C" MAPNIK_EXP datasource* create(parameters const& params) \ - { \ - return new classname(params); \ - } \ - extern "C" MAPNIK_EXP void destroy(datasource *ds) \ - { \ - delete ds; \ - } +#ifdef MAPNIK_STATIC_PLUGINS + #define DATASOURCE_PLUGIN(classname) +#else + #define DATASOURCE_PLUGIN(classname) \ + extern "C" MAPNIK_EXP const char * datasource_name() \ + { \ + return classname::name(); \ + } \ + extern "C" MAPNIK_EXP datasource* create(parameters const& params) \ + { \ + return new classname(params); \ + } \ + extern "C" MAPNIK_EXP void destroy(datasource *ds) \ + { \ + delete ds; \ + } +#endif } diff --git a/include/mapnik/datasource_cache.hpp b/include/mapnik/datasource_cache.hpp index f15492a7e..74a70c992 100644 --- a/include/mapnik/datasource_cache.hpp +++ b/include/mapnik/datasource_cache.hpp @@ -26,7 +26,6 @@ // mapnik #include #include -#include #include #include @@ -38,6 +37,8 @@ namespace mapnik { +class PluginInfo; + class MAPNIK_DECL datasource_cache : public singleton, private mapnik::noncopyable @@ -54,7 +55,6 @@ private: ~datasource_cache(); std::map > plugins_; bool registered_; - bool insert(std::string const& name,const lt_dlhandle module); std::vector plugin_directories_; }; } diff --git a/include/mapnik/debug.hpp b/include/mapnik/debug.hpp index caf5777fc..c190eef96 100644 --- a/include/mapnik/debug.hpp +++ b/include/mapnik/debug.hpp @@ -164,7 +164,7 @@ namespace mapnik { public: typedef std::basic_ostringstream stream_buffer; - void operator()(const logger::severity_type& severity, const stream_buffer &s) + void operator()(const logger::severity_type& /*severity*/, const stream_buffer &s) { #ifdef MAPNIK_THREADSAFE static boost::mutex mutex; @@ -193,15 +193,19 @@ namespace mapnik { base_log() {} +#ifdef MAPNIK_LOG base_log(const char* object_name) { -#ifdef MAPNIK_LOG if (object_name != NULL) { object_name_ = object_name; } -#endif } +#else + base_log(const char* /*object_name*/) + { + } +#endif ~base_log() { @@ -214,13 +218,20 @@ namespace mapnik { } template +#ifdef MAPNIK_LOG base_log &operator<<(const T &x) { -#ifdef MAPNIK_LOG + streambuf_ << x; -#endif return *this; } +#else + base_log &operator<<(const T& /*x*/) + { + + return *this; + } +#endif private: #ifdef MAPNIK_LOG diff --git a/include/mapnik/debug_symbolizer.hpp b/include/mapnik/debug_symbolizer.hpp index 91ea152d2..225b97c54 100644 --- a/include/mapnik/debug_symbolizer.hpp +++ b/include/mapnik/debug_symbolizer.hpp @@ -25,14 +25,30 @@ #include #include +#include namespace mapnik { +enum debug_symbolizer_mode_enum { + DEBUG_SYM_MODE_COLLISION, + DEBUG_SYM_MODE_VERTEX, + debug_symbolizer_mode_enum_MAX +}; + +DEFINE_ENUM( debug_symbolizer_mode_e, debug_symbolizer_mode_enum ); + struct MAPNIK_DECL debug_symbolizer : public symbolizer_base { - debug_symbolizer() : symbolizer_base() {} + debug_symbolizer(); + debug_symbolizer(debug_symbolizer const& rhs); + debug_symbolizer_mode_e get_mode() const; + void set_mode(debug_symbolizer_mode_e mode); + +private: + debug_symbolizer_mode_e mode_; + }; } diff --git a/include/mapnik/enumeration.hpp b/include/mapnik/enumeration.hpp index 229bc0906..9b61c7e3e 100644 --- a/include/mapnik/enumeration.hpp +++ b/include/mapnik/enumeration.hpp @@ -320,8 +320,14 @@ operator>>(std::istream & is, mapnik::enumeration & e) /** Helper macro. Creates a typedef. * @relates mapnik::enumeration */ +#ifdef _MSC_VER +#define DEFINE_ENUM( name, e) \ + template enumeration; \ + typedef enumeration name +#else #define DEFINE_ENUM( name, e) \ typedef enumeration name +#endif /** Helper macro. Runs the verify_mapnik_enum() method during static initialization. * @relates mapnik::enumeration diff --git a/include/mapnik/expression_evaluator.hpp b/include/mapnik/expression_evaluator.hpp index 5da143a1d..1008be4ee 100644 --- a/include/mapnik/expression_evaluator.hpp +++ b/include/mapnik/expression_evaluator.hpp @@ -57,9 +57,9 @@ struct evaluate : boost::static_visitor return attr.value(feature_); } - value_type operator() (geometry_type_attribute const& attr) const + value_type operator() (geometry_type_attribute const& geom) const { - return attr.value(feature_); + return geom.value(feature_); } value_type operator() (binary_node const & x) const diff --git a/include/mapnik/expression_grammar.hpp b/include/mapnik/expression_grammar.hpp index 2702048a3..ed4a43008 100644 --- a/include/mapnik/expression_grammar.hpp +++ b/include/mapnik/expression_grammar.hpp @@ -24,6 +24,7 @@ #define MAPNIK_EXPRESSIONS_GRAMMAR_HPP // mapnik +#include #include #include #include diff --git a/include/mapnik/expression_grammar_impl.hpp b/include/mapnik/expression_grammar_impl.hpp new file mode 100644 index 000000000..5ca2c5eeb --- /dev/null +++ b/include/mapnik/expression_grammar_impl.hpp @@ -0,0 +1,191 @@ +/***************************************************************************** + * + * 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 + * + *****************************************************************************/ + +// NOTE: This is an implementation header file and is only meant to be included +// from implementation files. It therefore doesn't have an include guard. + +// mapnik +#include +#include +#include +#include + +// boost +#include +#include +#include +#include + +// fwd declare +namespace mapnik { + struct attribute; + struct geometry_type_attribute; +} + +namespace mapnik +{ + +template +expr_node regex_match_impl::operator() (T0 & node, T1 const& pattern) const +{ +#if defined(BOOST_REGEX_HAS_ICU) + return regex_match_node(node,tr_.transcode(pattern.c_str())); +#else + return regex_match_node(node,pattern); +#endif +} + +template +expr_node regex_replace_impl::operator() (T0 & node, T1 const& pattern, T2 const& format) const +{ +#if defined(BOOST_REGEX_HAS_ICU) + return regex_replace_node(node,tr_.transcode(pattern.c_str()),tr_.transcode(format.c_str())); +#else + return regex_replace_node(node,pattern,format); +#endif +} + +template +expression_grammar::expression_grammar(mapnik::transcoder const& tr) + : expression_grammar::base_type(expr), + unicode_(unicode_impl(tr)), + regex_match_(regex_match_impl(tr)), + regex_replace_(regex_replace_impl(tr)) +{ + using boost::phoenix::construct; + using qi::_1; + using qi::_a; + using qi::_b; + using qi::_r1; +#if BOOST_VERSION > 104200 + using qi::no_skip; +#endif + using qi::lexeme; + using qi::_val; + using qi::lit; + using qi::double_; + using qi::hex; + using qi::omit; + using standard_wide::char_; + using standard_wide::no_case; + + expr = logical_expr.alias(); + + logical_expr = not_expr [_val = _1] + >> + *( ( ( lit("and") | lit("&&")) >> not_expr [_val && _1] ) + | (( lit("or") | lit("||")) >> not_expr [_val || _1]) + ) + ; + + not_expr = + cond_expr [_val = _1 ] + | ((lit("not") | lit('!')) >> cond_expr [ _val = !_1 ]) + ; + + cond_expr = equality_expr [_val = _1] | additive_expr [_val = _1] + ; + + equality_expr = + relational_expr [_val = _1] + >> *( ( (lit("=") | lit("eq") | lit("is")) >> relational_expr [_val == _1]) + | (( lit("!=") | lit("<>") | lit("neq") ) >> relational_expr [_val != _1]) + ) + ; + + regex_match_expr = lit(".match") + >> lit('(') + >> ustring [_val = _1] + >> lit(')') + ; + + regex_replace_expr = + lit(".replace") + >> lit('(') + >> ustring [_a = _1] + >> lit(',') + >> ustring [_b = _1] + >> lit(')') [_val = regex_replace_(_r1,_a,_b)] + ; + + relational_expr = additive_expr[_val = _1] + >> + *( ( (lit("<=") | lit("le") ) >> additive_expr [ _val <= _1 ]) + | ( (lit('<') | lit("lt") ) >> additive_expr [ _val < _1 ]) + | ( (lit(">=") | lit("ge") ) >> additive_expr [ _val >= _1 ]) + | ( (lit('>') | lit("gt") ) >> additive_expr [ _val > _1 ]) + ) + ; + + additive_expr = multiplicative_expr [_val = _1] + >> * ( '+' >> multiplicative_expr[_val += _1] + | '-' >> multiplicative_expr[_val -= _1] + ) + ; + + multiplicative_expr = unary_expr [_val = _1] + >> *( '*' >> unary_expr [_val *= _1] + | '/' >> unary_expr [_val /= _1] + | '%' >> unary_expr [_val %= _1] + | regex_match_expr[_val = regex_match_(_val, _1)] + | regex_replace_expr(_val) [_val = _1] + ) + ; + + unary_expr = primary_expr [_val = _1] + | '+' >> primary_expr [_val = _1] + | '-' >> primary_expr [_val = -_1] + ; + + primary_expr = strict_double [_val = _1] + | int__[_val = _1] + | no_case[lit("true")] [_val = true] + | no_case[lit("false")] [_val = false] + | no_case[lit("null")] [_val = value_null() ] + | no_case[geom_type][_val = _1 ] + | ustring [_val = unicode_(_1) ] + | lit("[mapnik::geometry_type]")[_val = construct()] + | attr [_val = construct( _1 ) ] + | '(' >> expr [_val = _1 ] >> ')' + ; + + unesc_char.add("\\a", '\a')("\\b", '\b')("\\f", '\f')("\\n", '\n') + ("\\r", '\r')("\\t", '\t')("\\v", '\v')("\\\\", '\\') + ("\\\'", '\'')("\\\"", '\"') + ; + +#if BOOST_VERSION > 104500 + quote_char %= char_('\'') | char_('"'); + ustring %= omit[quote_char[_a = _1]] + >> *(unesc_char | "\\x" >> hex | (char_ - lit(_a))) + >> lit(_a); + attr %= '[' >> no_skip[+~char_(']')] >> ']'; +#else + ustring %= lit('\'') + >> *(unesc_char | "\\x" >> hex | (char_ - lit('\''))) + >> lit('\''); + attr %= '[' >> lexeme[+(char_ - ']')] >> ']'; +#endif + +} + +} diff --git a/include/mapnik/factory.hpp b/include/mapnik/factory.hpp index 012c5de84..775329c09 100644 --- a/include/mapnik/factory.hpp +++ b/include/mapnik/factory.hpp @@ -40,7 +40,7 @@ public: { const char* what() const throw() { - return "uknown object type"; + return "unknown object type"; } }; static product_type* on_unknown_type(const key_type&) @@ -83,7 +83,17 @@ public: { return (pos->second)(file); } - return factory_error_policy::on_unknown_type(key); + return 0; + } + + product_type* create_object(const key_type& key, char const* data, std::size_t size) + { + typename product_map::const_iterator pos=map_.find(key); + if (pos!=map_.end()) + { + return (pos->second)(data, size); + } + return 0; } }; } diff --git a/include/mapnik/feature.hpp b/include/mapnik/feature.hpp index 352a463c1..ce9a3dc79 100644 --- a/include/mapnik/feature.hpp +++ b/include/mapnik/feature.hpp @@ -87,8 +87,8 @@ private: map_type mapping_; }; -typedef MAPNIK_DECL context > context_type; -typedef MAPNIK_DECL boost::shared_ptr context_ptr; +typedef context > context_type; +typedef boost::shared_ptr context_ptr; static const value default_value; @@ -306,9 +306,10 @@ inline std::ostream& operator<< (std::ostream & out,feature_impl const& f) return out; } +// TODO - remove at Mapnik 3.x typedef feature_impl Feature; -typedef MAPNIK_DECL boost::shared_ptr feature_ptr; +typedef boost::shared_ptr feature_ptr; } diff --git a/include/mapnik/feature_factory.hpp b/include/mapnik/feature_factory.hpp index 9a6574932..7896ef04b 100644 --- a/include/mapnik/feature_factory.hpp +++ b/include/mapnik/feature_factory.hpp @@ -35,11 +35,11 @@ namespace mapnik { struct feature_factory { - static boost::shared_ptr create (context_ptr const& ctx, mapnik::value_integer fid) + static boost::shared_ptr create (context_ptr const& ctx, mapnik::value_integer fid) { - //return boost::allocate_shared(boost::pool_allocator(),fid); - //return boost::allocate_shared(boost::fast_pool_allocator(),fid); - return boost::make_shared(ctx,fid); + //return boost::allocate_shared(boost::pool_allocator(),fid); + //return boost::allocate_shared(boost::fast_pool_allocator(),fid); + return boost::make_shared(ctx,fid); } }; } diff --git a/include/mapnik/feature_style_processor.hpp b/include/mapnik/feature_style_processor.hpp index e7a54fb84..93a3114bb 100644 --- a/include/mapnik/feature_style_processor.hpp +++ b/include/mapnik/feature_style_processor.hpp @@ -25,6 +25,7 @@ // mapnik #include // for featureset_ptr +#include // stl #include @@ -48,44 +49,49 @@ enum eAttributeCollectionPolicy }; template -class feature_style_processor +class MAPNIK_DECL feature_style_processor { struct symbol_dispatch; public: - explicit feature_style_processor(Map const& m, double scale_factor = 1.0); + explicit feature_style_processor(Map const& m, + double scale_factor = 1.0); /*! * \brief apply renderer to all map layers. */ - void apply(); + void apply(double scale_denom_override=0.0); /*! * \brief apply renderer to a single layer, providing pre-populated set of query attribute names. */ - void apply(mapnik::layer const& lyr, std::set& names); + void apply(mapnik::layer const& lyr, + std::set& names, + double scale_denom_override=0.0); /*! * \brief render a layer given a projection and scale. */ void apply_to_layer(layer const& lay, Processor & p, projection const& proj0, + double scale, double scale_denom, + unsigned width, + unsigned height, + box2d const& extent, + int buffer_size, std::set& names); private: /*! * \brief renders a featureset with the given styles. */ - void render_style(layer const& lay, - Processor & p, + void render_style(Processor & p, feature_type_style const* style, rule_cache const& rules, - std::string const& style_name, featureset_ptr features, proj_transform const& prj_trans); Map const& m_; - double scale_factor_; }; } diff --git a/include/mapnik/feature_style_processor_impl.hpp b/include/mapnik/feature_style_processor_impl.hpp index beb5d00f8..dbe0b68ea 100644 --- a/include/mapnik/feature_style_processor_impl.hpp +++ b/include/mapnik/feature_style_processor_impl.hpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -41,26 +40,19 @@ #include #include #include -#include #include #include #include +#include // boost #include #include #include -#include // stl #include - - -#if defined(RENDERING_STATS) -#include -#include -#include -#endif +#include namespace mapnik { @@ -81,11 +73,8 @@ template <> // No-op specialization struct process_impl { template - static void process(T0 & ren, T1 const& sym, T2 & f, T3 const& tr) + static void process(T0 & /*ren*/, T1 const& /*sym*/, T2 & /*f*/, T3 const& /*tr*/) { - boost::ignore_unused_variable_warning(ren); - boost::ignore_unused_variable_warning(f); - boost::ignore_unused_variable_warning(tr); #ifdef MAPNIK_DEBUG std::clog << "NO-OP ...\n"; #endif @@ -139,75 +128,73 @@ struct has_process template feature_style_processor::feature_style_processor(Map const& m, double scale_factor) - : m_(m), - scale_factor_(scale_factor) + : m_(m) { // https://github.com/mapnik/mapnik/issues/1100 - if (scale_factor_ <= 0) + if (scale_factor <= 0) { throw std::runtime_error("scale_factor must be greater than 0.0"); } } template -void feature_style_processor::apply() +void feature_style_processor::apply(double scale_denom) { -#if defined(RENDERING_STATS) - std::clog << "\n//-- starting rendering timer...\n"; - mapnik::progress_timer t(std::clog, "total map rendering"); -#endif - Processor & p = static_cast(*this); p.start_map_processing(m_); - try - { - projection proj(m_.srs(),true); - double scale_denom = mapnik::scale_denominator(m_.scale(),proj.is_geographic()); - scale_denom *= scale_factor_; + projection proj(m_.srs(),true); + if (scale_denom <= 0.0) + scale_denom = mapnik::scale_denominator(m_.scale(),proj.is_geographic()); + scale_denom *= p.scale_factor(); - BOOST_FOREACH ( layer const& lyr, m_.layers() ) - { - if (lyr.visible(scale_denom)) - { - std::set names; - apply_to_layer(lyr, p, proj, scale_denom, names); - } - } - } - catch (proj_init_error& ex) + BOOST_FOREACH ( layer const& lyr, m_.layers() ) { - MAPNIK_LOG_ERROR(feature_style_processor) << "feature_style_processor: proj_init_error=" << ex.what(); + if (lyr.visible(scale_denom)) + { + std::set names; + apply_to_layer(lyr, + p, + proj, + m_.scale(), + scale_denom, + m_.width(), + m_.height(), + m_.get_current_extent(), + m_.buffer_size(), + names); + + } } p.end_map_processing(m_); -#if defined(RENDERING_STATS) - t.stop(); - std::clog << "//-- rendering timer stopped...\n\n"; -#endif - } template -void feature_style_processor::apply(mapnik::layer const& lyr, std::set& names) +void feature_style_processor::apply(mapnik::layer const& lyr, + std::set& names, + double scale_denom) { Processor & p = static_cast(*this); p.start_map_processing(m_); - try - { - projection proj(m_.srs(),true); - double scale_denom = mapnik::scale_denominator(m_.scale(),proj.is_geographic()); - scale_denom *= scale_factor_; + projection proj(m_.srs(),true); + if (scale_denom <= 0.0) + scale_denom = mapnik::scale_denominator(m_.scale(),proj.is_geographic()); + scale_denom *= p.scale_factor(); - if (lyr.visible(scale_denom)) - { - apply_to_layer(lyr, p, proj, scale_denom, names); - } - } - catch (proj_init_error& ex) + if (lyr.visible(scale_denom)) { - MAPNIK_LOG_ERROR(feature_style_processor) << "feature_style_processor: proj_init_error=" << ex.what(); + apply_to_layer(lyr, + p, + proj, + m_.scale(), + scale_denom, + m_.width(), + m_.height(), + m_.get_current_extent(), + m_.buffer_size(), + names); } p.end_map_processing(m_); } @@ -215,7 +202,12 @@ void feature_style_processor::apply(mapnik::layer const& lyr, std::se template void feature_style_processor::apply_to_layer(layer const& lay, Processor & p, projection const& proj0, + double scale, double scale_denom, + unsigned width, + unsigned height, + box2d const& extent, + int buffer_size, std::set& names) { std::vector const& style_names = lay.styles(); @@ -236,41 +228,29 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces return; } -#if defined(RENDERING_STATS) - progress_timer layer_timer(std::clog, "rendering total for layer: '" + lay.name() + "'"); -#endif - projection proj1(lay.srs(),true); proj_transform prj_trans(proj0,proj1); -#if defined(RENDERING_STATS) - if (! prj_trans.equal()) - { - std::clog << "notice: reprojecting layer: '" << lay.name() << "' from/to:\n\t'" - << lay.srs() << "'\n\t'" - << m_.srs() << "'\n"; - } -#endif - - - box2d query_ext = m_.get_current_extent(); // unbuffered + box2d query_ext = extent; // unbuffered box2d buffered_query_ext(query_ext); // buffered + double buffer_padding = 2.0 * scale; boost::optional layer_buffer_size = lay.buffer_size(); if (layer_buffer_size) // if layer overrides buffer size, use this value to compute buffered extent { - double extra = 2.0 * m_.scale() * *layer_buffer_size; - buffered_query_ext.width(query_ext.width() + extra); - buffered_query_ext.height(query_ext.height() + extra); + buffer_padding *= *layer_buffer_size; } else { - buffered_query_ext = m_.get_buffered_extent(); + buffer_padding *= buffer_size; } + buffered_query_ext.width(query_ext.width() + buffer_padding); + buffered_query_ext.height(query_ext.height() + buffer_padding); // clip buffered extent by maximum extent, if supplied boost::optional > const& maximum_extent = m_.maximum_extent(); - if (maximum_extent) { + if (maximum_extent) + { buffered_query_ext.clip(*maximum_extent); } @@ -329,9 +309,6 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces } } } -#if defined(RENDERING_STATS) - layer_timer.discard(); -#endif return; } @@ -363,14 +340,12 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces double qw = query_ext.width()>0 ? query_ext.width() : 1; double qh = query_ext.height()>0 ? query_ext.height() : 1; - query::resolution_type res(m_.width()/qw, - m_.height()/qh); + query::resolution_type res(width/qw, + height/qh); - query q(layer_ext,res,scale_denom,m_.get_current_extent()); + query q(layer_ext,res,scale_denom,extent); std::vector active_styles; attribute_collector collector(names); - double filt_factor = 1.0; - directive_collector d_collector(filt_factor); boost::ptr_vector rule_caches; // iterate through all named styles collecting active styles and attribute names @@ -395,11 +370,7 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces { rc->add_rule(r); active_rules = true; - if (ds->type() == datasource::Vector) - { - collector(r); - } - // TODO - in the future rasters should be able to be filtered. + collector(r); } } if (active_rules) @@ -427,46 +398,25 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces q.add_property_name(name); } } - - // Update filter_factor for all enabled raster layers. - BOOST_FOREACH (feature_type_style const* style, active_styles) - { - BOOST_FOREACH(rule const& r, style->get_rules()) - { - if (r.active(scale_denom) && - ds->type() == datasource::Raster && - ds->params().get("filter_factor",0.0) == 0.0) - { - BOOST_FOREACH (rule::symbolizers::value_type sym, r.get_symbolizers()) - { - // if multiple raster symbolizers, last will be respected - // should we warn or throw? - boost::apply_visitor(d_collector,sym); - } - q.set_filter_factor(filt_factor); - } - } - } + q.set_filter_factor(collector.get_filter_factor()); // Also query the group by attribute - std::string group_by = lay.group_by(); - if (group_by != "") + std::string const& group_by = lay.group_by(); + if (!group_by.empty()) { q.add_property_name(group_by); } bool cache_features = lay.cache_features() && active_styles.size() > 1; - // Render incrementally when the column that we group by - // changes value. - if (group_by != "") + // Render incrementally when the column that we group by changes value. + if (!group_by.empty()) { featureset_ptr features = ds->features(q); - if (features) { - // Cache all features into the memory_datasource before rendering. - memory_datasource cache(ds->type(),false); + if (features) + { + boost::shared_ptr cache = boost::make_shared(); feature_ptr feature, prev; - while ((feature = features->next())) { if (prev && prev->get(group_by) != feature->get(group_by)) @@ -476,44 +426,45 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces int i = 0; BOOST_FOREACH (feature_type_style const* style, active_styles) { - render_style(lay, p, style, rule_caches[i], style_names[i], - cache.features(q), prj_trans); + cache->prepare(); + render_style(p, style, rule_caches[i], cache, prj_trans); i++; } - cache.clear(); + cache->clear(); } - cache.push(feature); + cache->push(feature); prev = feature; } int i = 0; BOOST_FOREACH (feature_type_style const* style, active_styles) { - render_style(lay, p, style, rule_caches[i], style_names[i], - cache.features(q), prj_trans); + cache->prepare(); + render_style(p, style, rule_caches[i], cache, prj_trans); i++; } } } else if (cache_features) { - memory_datasource cache(ds->type(),false); featureset_ptr features = ds->features(q); - if (features) { - // Cache all features into the memory_datasource before rendering. + boost::shared_ptr cache = boost::make_shared(); + if (features) + { feature_ptr feature; while ((feature = features->next())) { - cache.push(feature); + cache->push(feature); } } int i = 0; BOOST_FOREACH (feature_type_style const* style, active_styles) { - render_style(lay, p, style, rule_caches[i], style_names[i], - cache.features(q), prj_trans); + cache->prepare(); + render_style(p, style, rule_caches[i], cache, prj_trans); i++; } + cache->clear(); } // We only have a single style and no grouping. else @@ -521,28 +472,20 @@ void feature_style_processor::apply_to_layer(layer const& lay, Proces int i = 0; BOOST_FOREACH (feature_type_style const* style, active_styles) { - render_style(lay, p, style, rule_caches[i], style_names[i], - ds->features(q), prj_trans); + render_style(p, style, rule_caches[i], ds->features(q), prj_trans); i++; } } } - -#if defined(RENDERING_STATS) - layer_timer.stop(); -#endif - p.end_layer_processing(lay); } template void feature_style_processor::render_style( - layer const& lay, Processor & p, feature_type_style const* style, rule_cache const& rc, - std::string const& style_name, featureset_ptr features, proj_transform const& prj_trans) { @@ -552,49 +495,24 @@ void feature_style_processor::render_style( p.end_style_processing(*style); return; } - -#if defined(RENDERING_STATS) - std::ostringstream s1; - s1 << "rendering style for layer: '" << lay.name() - << "' and style '" << style_name << "'"; - mapnik::progress_timer style_timer(std::clog, s1.str()); - - int feature_processed_count = 0; - int feature_count = 0; -#endif - feature_ptr feature; + bool was_painted = false; while ((feature = features->next())) { -#if defined(RENDERING_STATS) - feature_count++; - bool feat_processed = false; -#endif - bool do_else = true; bool do_also = false; - BOOST_FOREACH(rule const* r, rc.get_if_rules() ) { expression_ptr const& expr=r->get_filter(); - value_type result = boost::apply_visitor(evaluate(*feature),*expr); + value_type result = boost::apply_visitor(evaluate(*feature),*expr); if (result.to_bool()) { -#if defined(RENDERING_STATS) - feat_processed = true; -#endif - - p.painted(true); - + was_painted = true; do_else=false; do_also=true; rule::symbolizers const& symbols = r->get_symbolizers(); - - // if the underlying renderer is not able to process the complete set of symbolizers, - // process one by one. if(!p.process(symbols,*feature,prj_trans)) { - BOOST_FOREACH (symbolizer const& sym, symbols) { boost::apply_visitor(symbol_dispatch(p,*feature,prj_trans),sym); @@ -612,15 +530,8 @@ void feature_style_processor::render_style( { BOOST_FOREACH( rule const* r, rc.get_else_rules() ) { -#if defined(RENDERING_STATS) - feat_processed = true; -#endif - - p.painted(true); - + was_painted = true; rule::symbolizers const& symbols = r->get_symbolizers(); - // if the underlying renderer is not able to process the complete set of symbolizers, - // process one by one. if(!p.process(symbols,*feature,prj_trans)) { BOOST_FOREACH (symbolizer const& sym, symbols) @@ -634,15 +545,8 @@ void feature_style_processor::render_style( { BOOST_FOREACH( rule const* r, rc.get_also_rules() ) { -#if defined(RENDERING_STATS) - feat_processed = true; -#endif - - p.painted(true); - + was_painted = true; rule::symbolizers const& symbols = r->get_symbolizers(); - // if the underlying renderer is not able to process the complete set of symbolizers, - // process one by one. if(!p.process(symbols,*feature,prj_trans)) { BOOST_FOREACH (symbolizer const& sym, symbols) @@ -652,32 +556,8 @@ void feature_style_processor::render_style( } } } -#if defined(RENDERING_STATS) - if (feat_processed) - feature_processed_count++; -#endif } - -#if defined(RENDERING_STATS) - style_timer.stop(); - - // done with style - std::ostringstream s; - if (feature_count > 0) - { - double perc_processed = ((double)feature_processed_count/(double)feature_count)*100.0; - - s << "percent rendered: " << perc_processed << "% - " << feature_processed_count - << " rendered for " << feature_count << " queried for "; - s << std::setw(15 - (int)s.tellp()) << " layer '" << lay.name() << "' and style '" << style_name << "'\n"; - } - else - { - s << "" << std::setw(15) << "- no features returned from query for layer '" << lay.name() << "' and style '" << style_name << "'\n"; - } - std::clog << s.str(); - style_timer.discard(); -#endif + p.painted(was_painted); p.end_style_processing(*style); } diff --git a/include/mapnik/filter_factory.hpp b/include/mapnik/filter_factory.hpp index 1150ece5d..68d729a6c 100644 --- a/include/mapnik/filter_factory.hpp +++ b/include/mapnik/filter_factory.hpp @@ -1,2 +1,8 @@ +// TODO - remove this file at mapnik 3.x +#ifdef _MSC_VER +#pragma NOTE("filter_factory.hpp" is now called "expression.hpp") +#else #warning "filter_factory.hpp" is now called "expression.hpp" +#endif + #include diff --git a/include/mapnik/filter_featureset.hpp b/include/mapnik/filter_featureset.hpp index b02cf3507..4b4041c4f 100644 --- a/include/mapnik/filter_featureset.hpp +++ b/include/mapnik/filter_featureset.hpp @@ -35,7 +35,7 @@ class filter_featureset : public Featureset typedef T filter_type; public: - filter_featureset(featureset_ptr fs, filter_type const& filter) + filter_featureset(featureset_ptr const& fs, filter_type const& filter) : fs_(fs), filter_(filter) {} feature_ptr next() diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp index 2e64f3351..5d4736125 100644 --- a/include/mapnik/font_engine_freetype.hpp +++ b/include/mapnik/font_engine_freetype.hpp @@ -27,22 +27,16 @@ #include #include #include +#include #include #include #include #include -#include #include +#include #include - -// freetype2 -extern "C" -{ -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_STROKER_H -} +#include +#include // boost #include @@ -57,16 +51,20 @@ extern "C" #include #include #include -#include // uci #include +struct FT_LibraryRec_; + namespace mapnik { class font_face; class text_path; class string_info; +struct char_properties; +class stroker; +struct glyph_t; typedef boost::shared_ptr face_ptr; @@ -92,59 +90,7 @@ private: typedef boost::shared_ptr glyph_ptr; -class font_face : mapnik::noncopyable -{ -public: - font_face(FT_Face face) - : face_(face) {} - std::string family_name() const - { - return std::string(face_->family_name); - } - - std::string style_name() const - { - return std::string(face_->style_name); - } - - FT_GlyphSlot glyph() const - { - return face_->glyph; - } - - FT_Face get_face() const - { - return face_; - } - - unsigned get_char(unsigned c) const - { - return FT_Get_Char_Index(face_, c); - } - - bool set_pixel_sizes(unsigned size) - { - if (! FT_Set_Pixel_Sizes( face_, 0, size )) - return true; - return false; - } - - bool set_character_sizes(double size) - { - if ( !FT_Set_Char_Size(face_,0,(FT_F26Dot6)(size * (1<<6)),0,0)) - return true; - return false; - } - - ~font_face() - { - FT_Done_Face(face_); - } - -private: - FT_Face face_; -}; class MAPNIK_DECL font_face_set : private mapnik::noncopyable { @@ -156,83 +102,18 @@ public: : faces_(), dimension_cache_() {} - void add(face_ptr face) - { - faces_.push_back(face); - dimension_cache_.clear(); //Make sure we don't use old cached data - } - - size_type size() const - { - return faces_.size(); - } - - glyph_ptr get_glyph(unsigned c) const - { - BOOST_FOREACH ( face_ptr const& face, faces_) - { - FT_UInt g = face->get_char(c); - if (g) return boost::make_shared(face, g); - } - - // Final fallback to empty square if nothing better in any font - return boost::make_shared(*faces_.begin(), 0); - } - - char_info character_dimensions(const unsigned c); - + void add(face_ptr face); + size_type size() const; + glyph_ptr get_glyph(unsigned c) const; + char_info character_dimensions(unsigned c); void get_string_info(string_info & info, UnicodeString const& ustr, char_properties *format); - - void set_pixel_sizes(unsigned size) - { - BOOST_FOREACH ( face_ptr const& face, faces_) - { - face->set_pixel_sizes(size); - } - } - - void set_character_sizes(double size) - { - BOOST_FOREACH ( face_ptr const& face, faces_) - { - face->set_character_sizes(size); - } - } + void set_pixel_sizes(unsigned size); + void set_character_sizes(double size); private: container_type faces_; std::map dimension_cache_; }; -// FT_Stroker wrapper -class stroker : mapnik::noncopyable -{ -public: - explicit stroker(FT_Stroker s) - : s_(s) {} - - void init(double radius) - { - FT_Stroker_Set(s_, (FT_Fixed) (radius * (1<<6)), - FT_STROKER_LINECAP_ROUND, - FT_STROKER_LINEJOIN_ROUND, - 0); - } - - FT_Stroker const& get() const - { - return s_; - } - - ~stroker() - { - FT_Stroker_Done(s_); - } -private: - FT_Stroker s_; -}; - - - typedef boost::shared_ptr face_set_ptr; typedef boost::shared_ptr stroker_ptr; @@ -260,11 +141,12 @@ public: virtual ~freetype_engine(); freetype_engine(); private: - FT_Library library_; + FT_LibraryRec_ * library_; #ifdef MAPNIK_THREADSAFE static boost::mutex mutex_; #endif static std::map > name2file_; + static std::map memory_fonts_; }; template @@ -312,9 +194,9 @@ public: { std::vector const& names = fset.get_face_names(); face_set_ptr face_set = boost::make_shared(); - for (std::vector::const_iterator name = names.begin(); name != names.end(); ++name) + BOOST_FOREACH( std::string const& name, names) { - face_ptr face = get_face(*name); + face_ptr face = get_face(name); if (face) { face_set->add(face); @@ -323,7 +205,7 @@ public: else { MAPNIK_LOG_DEBUG(font_engine_freetype) - << "Failed to find face '" << *name + << "Failed to find face '" << name << "' in font set '" << fset.get_name() << "'\n"; } #endif @@ -343,7 +225,7 @@ public: } } - stroker_ptr get_stroker() + inline stroker_ptr get_stroker() { return stroker_; } @@ -357,71 +239,23 @@ private: template struct text_renderer : private mapnik::noncopyable { - struct glyph_t : mapnik::noncopyable - { - FT_Glyph image; - char_properties *properties; - glyph_t(FT_Glyph image_, char_properties *properties_) - : image(image_), properties(properties_) {} - ~glyph_t () { FT_Done_Glyph(image);} - }; typedef boost::ptr_vector glyphs_t; typedef T pixmap_type; text_renderer (pixmap_type & pixmap, face_manager & font_manager, - stroker & s, + halo_rasterizer_e rasterizer, composite_mode_e comp_op = src_over, double scale_factor=1.0); box2d prepare_glyphs(text_path const& path); - void render(pixel_position pos); - void render_id(int feature_id, pixel_position pos, double min_radius=1.0); - + void render(pixel_position const& pos); + void render_id(mapnik::value_integer feature_id, + pixel_position const& pos); private: - - void render_bitmap(FT_Bitmap *bitmap, unsigned rgba, int x, int y, double opacity) - { - int x_max=x+bitmap->width; - int y_max=y+bitmap->rows; - int i,p,j,q; - - for (i=x,p=0;ibuffer[q*bitmap->width+p]; - if (gray) - { - pixmap_.blendPixel2(i, j, rgba, gray, opacity); - } - } - } - } - - void render_bitmap_id(FT_Bitmap *bitmap,int feature_id,int x,int y) - { - int x_max=x+bitmap->width; - int y_max=y+bitmap->rows; - int i,p,j,q; - - for (i=x,p=0;ibuffer[q*bitmap->width+p]; - if (gray) - { - pixmap_.setPixel(i,j,feature_id); - //pixmap_.blendPixel2(i,j,rgba,gray,opacity_); - } - } - } - } - pixmap_type & pixmap_; face_manager & font_manager_; - stroker & stroker_; + halo_rasterizer_e rasterizer_; glyphs_t glyphs_; composite_mode_e comp_op_; double scale_factor_; diff --git a/include/mapnik/font_util.hpp b/include/mapnik/font_util.hpp new file mode 100644 index 000000000..6e04988a2 --- /dev/null +++ b/include/mapnik/font_util.hpp @@ -0,0 +1,145 @@ +/***************************************************************************** + * + * 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_FONT_UTIL_HPP +#define MAPNIK_FONT_UTIL_HPP + +// mapnik +#include + +#include + +// freetype2 +extern "C" +{ +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_STROKER_H +} + +namespace mapnik +{ +struct char_properties; + +struct glyph_t : mapnik::noncopyable +{ + FT_Glyph image; + char_properties *properties; + glyph_t(FT_Glyph image_, char_properties *properties_) + : image(image_), + properties(properties_) {} + ~glyph_t() + { + FT_Done_Glyph(image); + } +}; + + +// FT_Stroker wrapper +class stroker : mapnik::noncopyable +{ +public: + explicit stroker(FT_Stroker s) + : s_(s) {} + + void init(double radius) + { + FT_Stroker_Set(s_, (FT_Fixed) (radius * (1<<6)), + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINEJOIN_ROUND, + 0); + } + + FT_Stroker const& get() const + { + return s_; + } + + ~stroker() + { + FT_Stroker_Done(s_); + } +private: + FT_Stroker s_; +}; + + +class font_face : mapnik::noncopyable +{ +public: + font_face(FT_Face face) + : face_(face) {} + + std::string family_name() const + { + return std::string(face_->family_name); + } + + std::string style_name() const + { + return std::string(face_->style_name); + } + + FT_GlyphSlot glyph() const + { + return face_->glyph; + } + + FT_Face get_face() const + { + return face_; + } + + unsigned get_char(unsigned c) const + { + return FT_Get_Char_Index(face_, c); + } + + bool set_pixel_sizes(unsigned size) + { + if (! FT_Set_Pixel_Sizes( face_, 0, size )) + return true; + return false; + } + + bool set_character_sizes(double size) + { + if ( !FT_Set_Char_Size(face_,0,(FT_F26Dot6)(size * (1<<6)),0,0)) + return true; + return false; + } + + ~font_face() + { + FT_Done_Face(face_); + } + +private: + FT_Face face_; +}; + +} + + +#endif // MAPNIK_FONT_UTIL_HPP diff --git a/include/mapnik/formatting/base.hpp b/include/mapnik/formatting/base.hpp index 327304345..023917326 100644 --- a/include/mapnik/formatting/base.hpp +++ b/include/mapnik/formatting/base.hpp @@ -40,7 +40,7 @@ namespace formatting { class node; typedef boost::shared_ptr node_ptr; -class node +class MAPNIK_DECL node { public: virtual ~node() {} diff --git a/include/mapnik/formatting/expression_format.hpp b/include/mapnik/formatting/expression_format.hpp index cf99747ff..da5f718cf 100644 --- a/include/mapnik/formatting/expression_format.hpp +++ b/include/mapnik/formatting/expression_format.hpp @@ -37,7 +37,7 @@ class xml_node; struct char_properties; namespace formatting { -class expression_format: public node { +class MAPNIK_DECL expression_format: public node { public: void to_xml(boost::property_tree::ptree &xml) const; static node_ptr from_xml(xml_node const& xml); diff --git a/include/mapnik/formatting/format.hpp b/include/mapnik/formatting/format.hpp index 6e634bd87..b22ea6398 100644 --- a/include/mapnik/formatting/format.hpp +++ b/include/mapnik/formatting/format.hpp @@ -32,7 +32,7 @@ namespace mapnik { namespace formatting { -class format_node: public node { +class MAPNIK_DECL format_node: public node { public: void to_xml(boost::property_tree::ptree &xml) const; static node_ptr from_xml(xml_node const& xml); diff --git a/include/mapnik/formatting/list.hpp b/include/mapnik/formatting/list.hpp index 96a49b262..56ab455a1 100644 --- a/include/mapnik/formatting/list.hpp +++ b/include/mapnik/formatting/list.hpp @@ -31,7 +31,7 @@ namespace mapnik { namespace formatting { -class list_node: public node { +class MAPNIK_DECL list_node: public node { public: list_node() : node(), children_() {} virtual void to_xml(boost::property_tree::ptree &xml) const; diff --git a/include/mapnik/formatting/text.hpp b/include/mapnik/formatting/text.hpp index fc5600675..bc63fe102 100644 --- a/include/mapnik/formatting/text.hpp +++ b/include/mapnik/formatting/text.hpp @@ -30,7 +30,7 @@ namespace mapnik { namespace formatting { -class text_node: public node { +class MAPNIK_DECL text_node: public node { public: text_node(expression_ptr text): node(), text_(text) {} text_node(std::string text): node(), text_(parse_expression(text)) {} diff --git a/include/mapnik/geom_util.hpp b/include/mapnik/geom_util.hpp index 94d1b746f..350c797ab 100644 --- a/include/mapnik/geom_util.hpp +++ b/include/mapnik/geom_util.hpp @@ -200,10 +200,10 @@ inline bool point_on_path(double x,double y,Iter start,Iter end, double tol) struct filter_in_box { box2d box_; - explicit filter_in_box(const box2d& box) + explicit filter_in_box(box2d const& box) : box_(box) {} - bool pass(const box2d& extent) const + bool pass(box2d const& extent) const { return extent.intersects(box_); } @@ -211,23 +211,16 @@ struct filter_in_box struct filter_at_point { - coord2d pt_; - double tol_; - explicit filter_at_point(const coord2d& pt, double tol=0) - : pt_(pt), - tol_(tol) {} - bool pass(const box2d& extent) const + box2d box_; + explicit filter_at_point(coord2d const& pt, double tol=0) + : box_(pt,pt) { - if (tol_ == 0) - { - return extent.contains(pt_); - } - else - { - box2d extent2 = extent; - extent2.pad(tol_); - return extent2.contains(pt_); - } + box_.pad(tol); + } + + bool pass(box2d const& extent) const + { + return extent.intersects(box_); } }; @@ -245,6 +238,7 @@ double path_length(PathType & path) double length = 0; while (SEG_END != (command = path.vertex(&x1, &y1))) { + if (command == SEG_CLOSE) continue; length += distance(x0,y0,x1,y1); x0 = x1; y0 = y1; @@ -268,6 +262,7 @@ bool middle_point(PathType & path, double & x, double & y) double dist = 0.0; while (SEG_END != (command = path.vertex(&x1, &y1))) { + if (command == SEG_CLOSE) continue; double seg_length = distance(x0, y0, x1, y1); if ( dist + seg_length >= mid_length) @@ -307,6 +302,7 @@ bool centroid(PathType & path, double & x, double & y) unsigned count = 1; while (SEG_END != (command = path.vertex(&x1, &y1))) { + if (command == SEG_CLOSE) continue; double dx0 = x0 - start_x; double dy0 = y0 - start_y; double dx1 = x1 - start_x; @@ -370,6 +366,7 @@ bool centroid_geoms(Iter start, Iter end, double & x, double & y) while (SEG_END != (command = path.vertex(&x1, &y1))) { + if (command == SEG_CLOSE) continue; double dx0 = x0 - start_x; double dy0 = y0 - start_y; double dx1 = x1 - start_x; @@ -421,6 +418,7 @@ bool hit_test(PathType & path, double x, double y, double tol) unsigned count = 0; while (SEG_END != (command = path.vertex(&x1, &y1))) { + if (command == SEG_CLOSE) continue; ++count; if (command == SEG_MOVETO) { @@ -468,6 +466,8 @@ bool interior_position(PathType & path, double & x, double & y) double y1 = 0; while (SEG_END != (command = path.vertex(&x1, &y1))) { + if (command == SEG_CLOSE) + continue; if (command != SEG_MOVETO) { // if the segments overlap diff --git a/include/mapnik/geometry.hpp b/include/mapnik/geometry.hpp index 6beaa6bc6..eb4c47223 100644 --- a/include/mapnik/geometry.hpp +++ b/include/mapnik/geometry.hpp @@ -133,37 +133,9 @@ public: push_vertex(x,y,SEG_MOVETO); } - void close(coord_type x, coord_type y) + void close_path() { - push_vertex(x,y,SEG_CLOSE); - } - - void set_close() - { - if (cont_.size() > 3) - { - unsigned cmd; - double x,y; - int index = cont_.size() - 1; - unsigned last_cmd = cont_.get_vertex(index,&x,&y); - if (last_cmd == SEG_LINETO) - { - double last_x = x; - double last_y = y; - for (int pos = index - 1; pos >=0 ; --pos) - { - cmd = cont_.get_vertex(pos,&x,&y); - if (cmd == SEG_MOVETO) - { - if (x == last_x && y == last_y) - { - cont_.set_command(index , SEG_CLOSE); - } - break; - } - } - } - } + push_vertex(0,0,SEG_CLOSE); } unsigned vertex(double* x, double* y) const diff --git a/include/mapnik/global.hpp b/include/mapnik/global.hpp index 22efed271..f4e200da8 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) 2011 Artem Pavlenko + * 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 @@ -29,6 +29,7 @@ // stl #include +#include namespace mapnik { diff --git a/include/mapnik/graphics.hpp b/include/mapnik/graphics.hpp index 1c559b6fe..b9a3c8f31 100644 --- a/include/mapnik/graphics.hpp +++ b/include/mapnik/graphics.hpp @@ -54,6 +54,7 @@ private: boost::optional background_; image_data_32 data_; bool painted_; + bool premultiplied_; public: image_32(int width,int height); image_32(image_32 const& rhs); @@ -72,6 +73,11 @@ public: return painted_; } + bool premultiplied() const + { + return premultiplied_; + } + inline void clear() { std::memset(data_.getData(),0,sizeof(mapnik::image_data_32::pixel_type)*data_.width()*data_.height()); @@ -118,9 +124,9 @@ public: private: - inline bool checkBounds(unsigned x, unsigned y) const + inline bool checkBounds(int x, int y) const { - return (x < width_ && y < height_); + return (x >= 0 && x < static_cast(width_) && y >= 0 && y < static_cast(height_)); } public: @@ -131,59 +137,6 @@ public: data_(x,y)=rgba; } } - inline void blendPixel(int x,int y,unsigned int rgba1,int t) - { - blendPixel2(x,y,rgba1,t,1.0); // do not change opacity - } - - inline void blendPixel2(int x,int y,unsigned int rgba1,int t,double opacity) - { - if (checkBounds(x,y)) - { - unsigned rgba0 = data_(x,y); -#ifdef MAPNIK_BIG_ENDIAN - unsigned a1 = (unsigned)((rgba1 & 0xff) * opacity) & 0xff; // adjust for desired opacity - a1 = (t*a1) / 255; - if (a1 == 0) return; - unsigned r1 = (rgba1 >> 24) & 0xff; - unsigned g1 = (rgba1 >> 16 ) & 0xff; - unsigned b1 = (rgba1 >> 8) & 0xff; - - unsigned a0 = (rgba0 & 0xff); - unsigned r0 = ((rgba0 >> 24 ) & 0xff) * a0; - unsigned g0 = ((rgba0 >> 16 ) & 0xff) * a0; - unsigned b0 = ((rgba0 >> 8) & 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; - data_(x,y)= (a0)| (b0 << 8) | (g0 << 16) | (r0 << 24) ; -#else - unsigned a1 = (unsigned)(((rgba1 >> 24) & 0xff) * opacity) & 0xff; // adjust for desired opacity - a1 = (t*a1) / 255; - if (a1 == 0) return; - 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; - data_(x,y)= (a0 << 24)| (b0 << 16) | (g0 << 8) | (r0) ; -#endif - } - } void composite_pixel(unsigned op, int x,int y,unsigned c, unsigned cover, double opacity); diff --git a/include/mapnik/grid/grid.hpp b/include/mapnik/grid/grid.hpp index d5e1c872a..e9d7e85c1 100644 --- a/include/mapnik/grid/grid.hpp +++ b/include/mapnik/grid/grid.hpp @@ -198,30 +198,6 @@ public: return height_; } - inline void blendPixel(value_type feature_id,int x,int y,unsigned int rgba1,int t) - { - blendPixel2(feature_id ,x,y,rgba1,t,1.0); // do not change opacity - } - - inline void blendPixel2(value_type feature_id,int x,int y,unsigned int rgba1,int t,double opacity) - { - if (checkBounds(x,y)) - { - -#ifdef MAPNIK_BIG_ENDIAN - unsigned a = (int)((rgba1 & 0xff) * opacity) & 0xff; // adjust for desired opacity -#else - unsigned a = (int)(((rgba1 >> 24) & 0xff) * opacity) & 0xff; // adjust for desired opacity -#endif - // if the pixel is more than a tenth - // opaque then burn in the feature id - if (a >= 25) - { - data_(x,y) = feature_id; - } - } - } - inline void set_rectangle(value_type id,image_data_32 const& data,int x0,int y0) { box2d ext0(0,0,width_,height_); @@ -256,7 +232,7 @@ public: }; -typedef MAPNIK_DECL hit_grid grid; +typedef hit_grid grid; } #endif //MAPNIK_GRID_HPP diff --git a/include/mapnik/grid/grid_marker_helpers.hpp b/include/mapnik/grid/grid_marker_helpers.hpp index f20c1d912..5acb73a5d 100644 --- a/include/mapnik/grid/grid_marker_helpers.hpp +++ b/include/mapnik/grid/grid_marker_helpers.hpp @@ -123,7 +123,7 @@ struct raster_markers_rasterizer_dispatch_grid sym_.get_max_error(), sym_.get_allow_overlap()); double x, y, angle; - while (placement.get_point(x, y, angle)) + while (placement.get_point(x, y, angle, sym_.get_ignore_placement())) { agg::trans_affine matrix = marker_trans_; matrix.rotate(angle); @@ -260,7 +260,7 @@ struct vector_markers_rasterizer_dispatch_grid sym_.get_max_error(), sym_.get_allow_overlap()); double x, y, angle; - while (placement.get_point(x, y, angle)) + while (placement.get_point(x, y, angle, sym_.get_ignore_placement())) { agg::trans_affine matrix = marker_trans_; matrix.rotate(angle); diff --git a/include/mapnik/grid/grid_pixfmt.hpp b/include/mapnik/grid/grid_pixfmt.hpp index 30c43fcd2..5ad790b9b 100644 --- a/include/mapnik/grid/grid_pixfmt.hpp +++ b/include/mapnik/grid/grid_pixfmt.hpp @@ -40,7 +40,7 @@ template struct blender_gray enum base_scale_e { base_shift = color_type::base_shift }; static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha, unsigned cover=0) + unsigned alpha, unsigned /*cover*/=0) { *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift); } @@ -256,7 +256,7 @@ public: void blend_hline(int x, int y, unsigned len, const color_type& c, - agg::int8u cover) + agg::int8u /*cover*/) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x * Step + Offset; @@ -588,7 +588,7 @@ public: void blend_from_color(const SrcPixelFormatRenderer& from, const color_type& color, int xdst, int ydst, - int xsrc, int ysrc, + int /*xsrc*/, int ysrc, unsigned len, agg::int8u cover) { @@ -615,7 +615,7 @@ public: void blend_from_lut(const SrcPixelFormatRenderer& from, const color_type* color_lut, int xdst, int ydst, - int xsrc, int ysrc, + int /*xsrc*/, int ysrc, unsigned len, agg::int8u cover) { diff --git a/include/mapnik/grid/grid_renderer.hpp b/include/mapnik/grid/grid_renderer.hpp index 3c4a90613..8abf326be 100644 --- a/include/mapnik/grid/grid_renderer.hpp +++ b/include/mapnik/grid/grid_renderer.hpp @@ -53,6 +53,7 @@ namespace mapnik { class marker; class proj_transform; struct grid_rasterizer; + class request; } namespace mapnik { @@ -66,13 +67,14 @@ public: typedef T buffer_type; typedef grid_renderer processor_impl_type; grid_renderer(Map const& m, T & pixmap, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + grid_renderer(Map const& m, request const& req, T & pixmap, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); ~grid_renderer(); void start_map_processing(Map const& map); void end_map_processing(Map const& map); void start_layer_processing(layer const& lay, box2d const& query_extent); void end_layer_processing(layer const& lay); - void start_style_processing(feature_type_style const& st) {} - void end_style_processing(feature_type_style const& st) {} + void start_style_processing(feature_type_style const& /*st*/) {} + void end_style_processing(feature_type_style const& /*st*/) {} void render_marker(mapnik::feature_impl & feature, unsigned int step, pixel_position const& pos, marker const& marker, const agg::trans_affine & tr, double opacity, composite_mode_e comp_op); void process(point_symbolizer const& sym, @@ -120,6 +122,10 @@ public: { return DEFAULT; } + inline double scale_factor() const + { + return scale_factor_; + } private: buffer_type & pixmap_; diff --git a/include/mapnik/grid/grid_view.hpp b/include/mapnik/grid/grid_view.hpp index 1f190c8a4..44fc9eaa7 100644 --- a/include/mapnik/grid/grid_view.hpp +++ b/include/mapnik/grid/grid_view.hpp @@ -79,7 +79,7 @@ public: { if (x_ >= data_.width()) x_=data_.width()-1; - if (y_ >= data_.height()) x_=data_.height()-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_; } diff --git a/include/mapnik/hash_variant.hpp b/include/mapnik/hash_variant.hpp new file mode 100644 index 000000000..2e6a866cd --- /dev/null +++ b/include/mapnik/hash_variant.hpp @@ -0,0 +1,48 @@ +//----------------------------------------------------------------------------- +// boost variant/detail/hash_variant.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2011 +// Antony Polukhin +// +// 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) + +// TODO: Remove this file once the minimum Boost version is bumped to 1.50 + +#ifndef BOOST_HASH_VARIANT_FUNCTION_HPP +#define BOOST_HASH_VARIANT_FUNCTION_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +#include +#include +#include +#include + +namespace boost { + + namespace detail { namespace variant { + struct variant_hasher: public boost::static_visitor { + template + std::size_t operator()(T const& val) const { + using namespace boost; + hash hasher; + return hasher(val); + } + }; + }} + + template < BOOST_VARIANT_ENUM_PARAMS(typename T) > + std::size_t hash_value(variant< BOOST_VARIANT_ENUM_PARAMS(T) > const& val) { + std::size_t seed = boost::apply_visitor(detail::variant::variant_hasher(), val); + hash_combine(seed, val.which()); + return seed; + } +} + +#endif diff --git a/include/mapnik/hit_test_filter.hpp b/include/mapnik/hit_test_filter.hpp index 792c8c12e..b9c1f6a6b 100644 --- a/include/mapnik/hit_test_filter.hpp +++ b/include/mapnik/hit_test_filter.hpp @@ -38,7 +38,7 @@ public: y_(y), tol_(tol) {} - bool pass(Feature & feature) + bool pass(feature_impl & feature) { BOOST_FOREACH(geometry_type & geom, feature.paths()) { diff --git a/include/mapnik/image_data.hpp b/include/mapnik/image_data.hpp index fde6f9518..4c87a5495 100644 --- a/include/mapnik/image_data.hpp +++ b/include/mapnik/image_data.hpp @@ -29,6 +29,8 @@ // stl #include #include +#include + namespace mapnik { @@ -37,11 +39,19 @@ template class ImageData public: typedef T pixel_type; - ImageData(unsigned width,unsigned height) - : width_(width), - height_(height), - pData_((width!=0 && height!=0)? static_cast(::operator new(sizeof(T)*width*height)):0) + ImageData(int width,int height) + : width_(static_cast(width)), + height_(static_cast(height)) { + 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(::operator new(sizeof(T)*width*height)):0; if (pData_) std::memset(pData_,0,sizeof(T)*width_*height_); } diff --git a/include/mapnik/image_filter.hpp b/include/mapnik/image_filter.hpp index d2fabc9f2..fc99431b6 100644 --- a/include/mapnik/image_filter.hpp +++ b/include/mapnik/image_filter.hpp @@ -26,19 +26,22 @@ //mapnik #include +#include // boost #include #include #include +#include // 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_blur.h" - +#include "agg_gradient_lut.h" // stl #include @@ -399,12 +402,188 @@ template 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::pixfmt_rgba32 pixf(buf); + agg::pixfmt_rgba32_pre pixf(buf); agg::stack_blur_rgba32(pixf,op.rx,op.ry); } template -void apply_filter(Src & src, gray const& op) +void apply_filter(Src & src, colorize_alpha const& op) +{ + using namespace boost::gil; + + agg::gradient_lut > grad_lut; + grad_lut.remove_all(); + std::size_t size = op.size(); + if (size < 2) return; + + double step = 1.0/(size-1); + double offset = 0.0; + BOOST_FOREACH( mapnik::filter::color_stop const& stop, op) + { + mapnik::color const& c = stop.color; + double stop_offset = stop.offset; + if (stop_offset == 0) + { + stop_offset = offset; + } + grad_lut.add_color(stop_offset, agg::rgba(c.red()/256.0, + c.green()/256.0, + c.blue()/256.0, + c.alpha()/256.0)); + offset += step; + } + grad_lut.build_lut(); + + rgba8_view_t src_view = rgba8_view(src); + for (int y=0; y 0) + { + agg::rgba8 c = grad_lut[a]; + r = (c.r * a + 255) >> 8; + g = (c.g * a + 255) >> 8; + b = (c.b * a + 255) >> 8; +#if 0 + // rainbow + r = 0; + g = 0; + b = 0; + if (a < 64) + { + g = a * 4; + b = 255; + } + else if (a >= 64 && a < 128) + { + g = 255; + b = 255 - ((a - 64) * 4); + } + else if (a >= 128 && a < 192) + { + r = (a - 128) * 4; + g = 255; + } + else // >= 192 + { + r = 255; + g = 255 - ((a - 192) * 4); + } + r = (r * a + 255) >> 8; + g = (g * a + 255) >> 8; + b = (b * a + 255) >> 8; +#endif + } + } + } +} + +template +void apply_filter(Src & src, scale_hsla const& transform) +{ + using namespace boost::gil; + bool tinting = !transform.is_identity(); + bool set_alpha = !transform.is_alpha_identity(); + // todo - filters be able to report if they + // should be run to avoid overhead of temp buffer + if (tinting || set_alpha) + { + rgba8_view_t src_view = rgba8_view(src); + for (int y=0; y(a)/255.0; + double a1 = a2; + bool alpha_modified = false; + if (set_alpha && a2 > 0.01) + { + a2 = transform.a0 + (a2 * (transform.a1 - transform.a0)); + if (a2 <= 0) + { + a = 0; + } + else + { + a = static_cast(std::floor((a2 * 255.0) +.5)); + if (a > 255) a = 255; + } + alpha_modified = true; + } + if (tinting && a > 1) + { + double h; + double s; + double l; + // demultiply + if (a1 <= 0.0) + { + r = g = b = 0; + continue; + } + else if (a1 < 1) + { + r /= a1; + g /= a1; + b /= a1; + } + rgb2hsl(r,g,b,h,s,l); + double h2 = transform.h0 + (h * (transform.h1 - transform.h0)); + double s2 = transform.s0 + (s * (transform.s1 - transform.s0)); + double l2 = transform.l0 + (l * (transform.l1 - transform.l0)); + if (h2 > 1) { h2 = 1; } + else if (h2 < 0) { h2 = 0; } + if (s2 > 1) { s2 = 1; } + else if (s2 < 0) { s2 = 0; } + if (l2 > 1) { l2 = 1; } + else if (l2 < 0) { l2 = 0; } + hsl2rgb(h2,s2,l2,r,g,b); + // premultiply + // we only work with premultiplied source, + // thus all color values must be <= alpha + r *= a2; + g *= a2; + b *= a2; + } + else if (alpha_modified) + { + // demultiply + if (a1 <= 0.0) + { + r = g = b = 0; + continue; + } + else if (a1 < 1) + { + r /= a1; + g /= a1; + b /= a1; + } + // premultiply + // we only work with premultiplied source, + // thus all color values must be <= alpha + r *= a2; + g *= a2; + b *= a2; + } + } + } + } +} + +template +void apply_filter(Src & src, gray const& /*op*/) { using namespace boost::gil; @@ -454,14 +633,14 @@ void x_gradient_impl(Src const& src_view, Dst const& dst_view) } template -void apply_filter(Src & src, x_gradient const& op) +void apply_filter(Src & src, x_gradient const& /*op*/) { double_buffer tb(src); x_gradient_impl(tb.src_view, tb.dst_view); } template -void apply_filter(Src & src, y_gradient const& op) +void apply_filter(Src & src, y_gradient const& /*op*/) { double_buffer tb(src); x_gradient_impl(rotated90ccw_view(tb.src_view), @@ -469,7 +648,7 @@ void apply_filter(Src & src, y_gradient const& op) } template -void apply_filter(Src & src, invert const& op) +void apply_filter(Src & src, invert const& /*op*/) { using namespace boost::gil; diff --git a/include/mapnik/image_filter_grammar.hpp b/include/mapnik/image_filter_grammar.hpp index 054cd856e..26156fbf1 100644 --- a/include/mapnik/image_filter_grammar.hpp +++ b/include/mapnik/image_filter_grammar.hpp @@ -25,22 +25,56 @@ // boost #include - +#include +// mapnik +#include +#include // stl #include +BOOST_FUSION_ADAPT_STRUCT( + mapnik::filter::color_stop, + (mapnik::color, color ) + (double, offset) +) + namespace mapnik { namespace qi = boost::spirit::qi; +struct percent_offset_impl +{ + template + struct result + { + typedef double type; + }; + + double operator() (double val) const + { + double result = std::abs(val/100.0); + if (result > 1.0) result = 1.0; + return result; + } +}; + + template struct image_filter_grammar : qi::grammar { image_filter_grammar(); qi::rule start; - qi::rule, qi::ascii::space_type> filter; + qi::rule filter; + qi::rule, void(ContType&), qi::ascii::space_type> agg_blur_filter; + qi::rule, + void(ContType&), qi::ascii::space_type> scale_hsla_filter; + qi::rule, void(ContType&), qi::ascii::space_type> colorize_alpha_filter; + qi::rule no_args; qi::uint_parser< unsigned, 10, 1, 3 > radius_; + css_color_grammar css_color_; + qi::rule color_stop_offset; + phoenix::function percent_offset; }; } diff --git a/include/mapnik/image_filter_types.hpp b/include/mapnik/image_filter_types.hpp index c8f5ea11b..e5f0b5db6 100644 --- a/include/mapnik/image_filter_types.hpp +++ b/include/mapnik/image_filter_types.hpp @@ -23,11 +23,12 @@ #ifndef MAPNIK_IMAGE_FILTER_TYPES_HPP #define MAPNIK_IMAGE_FILTER_TYPES_HPP +// mapnik +#include +#include // boost -#include - +#include // stl -#include #include #include #include // for std::back_insert_iterator @@ -52,6 +53,56 @@ struct agg_stack_blur unsigned ry; }; +struct scale_hsla +{ + scale_hsla(double _h0, double _h1, + double _s0, double _s1, + double _l0, double _l1, + double _a0, double _a1) : + h0(_h0), + h1(_h1), + s0(_s0), + s1(_s1), + l0(_l0), + l1(_l1), + a0(_a0), + a1(_a1) {} + inline bool is_identity() const { + return (h0 == 0 && + h1 == 1 && + s0 == 0 && + s1 == 1 && + l0 == 0 && + l1 == 1); + } + inline bool is_alpha_identity() const { + return (a0 == 0 && + a1 == 1); + } + double h0; + double h1; + double s0; + double s1; + double l0; + double l1; + double a0; + double a1; +}; + +struct color_stop +{ + color_stop() {} + color_stop(mapnik::color const& c, double val = 0.0) + : color(c),offset(val) {} + mapnik::color color; + double offset; +}; + +struct colorize_alpha : std::vector +{ + colorize_alpha() {} +}; + typedef boost::variant filter_type; + filter::invert, + filter::scale_hsla, + filter::colorize_alpha> filter_type; inline std::ostream& operator<< (std::ostream& os, blur) { @@ -77,7 +130,16 @@ inline std::ostream& operator<< (std::ostream& os, gray) inline std::ostream& operator<< (std::ostream& os, agg_stack_blur const& filter) { - os << "agg-stack-blur:" << filter.rx << ',' << filter.ry; + os << "agg-stack-blur(" << filter.rx << ',' << filter.ry << ')'; + return os; +} + +inline std::ostream& operator<< (std::ostream& os, scale_hsla const& filter) +{ + os << "hsla-transform(" << filter.h0 << 'x' << filter.h1 << ':' + << filter.s0 << 'x' << filter.s1 << ':' + << filter.l0 << 'x' << filter.l1 << ':' + << filter.a0 << 'x' << filter.a1 << ')'; return os; } @@ -123,9 +185,31 @@ inline std::ostream& operator<< (std::ostream& os, invert) return os; } -inline std::ostream& operator<< (std::ostream& os, filter_type const& filter); +template +struct to_string_visitor : boost::static_visitor +{ + to_string_visitor(Out & out) + : out_(out) {} -bool generate_image_filters(std::back_insert_iterator & sink, std::vector const& v); + template + void operator () (T const& filter_tag) + { + out_ << filter_tag; + } + + Out & out_; +}; + +inline std::ostream& operator<< (std::ostream& os, filter_type const& filter) +{ + to_string_visitor visitor(os); + boost::apply_visitor(visitor, filter); + return os; +} + +MAPNIK_DECL bool generate_image_filters(std::back_insert_iterator & sink, std::vector const& v); + +MAPNIK_DECL bool parse_image_filters(std::string const& filters, std::vector& image_filters); }} diff --git a/include/mapnik/image_reader.hpp b/include/mapnik/image_reader.hpp index bda9b735e..c30d1da6f 100644 --- a/include/mapnik/image_reader.hpp +++ b/include/mapnik/image_reader.hpp @@ -26,13 +26,17 @@ // mapnik #include #include - +#include +#include +// boost +#include // stl #include #include namespace mapnik { + class image_reader_exception : public std::exception { private: @@ -49,7 +53,7 @@ public: } }; -struct MAPNIK_DECL image_reader +struct MAPNIK_DECL image_reader : private mapnik::noncopyable { virtual unsigned width() const=0; virtual unsigned height() const=0; @@ -59,8 +63,11 @@ struct MAPNIK_DECL image_reader }; bool register_image_reader(std::string const& type,image_reader* (*)(std::string const&)); +bool register_image_reader(std::string const& type,image_reader* (*)(char const*, std::size_t)); + 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 89e5fcd69..d412eda5f 100644 --- a/include/mapnik/image_scaling.hpp +++ b/include/mapnik/image_scaling.hpp @@ -61,11 +61,11 @@ template void scale_image_agg(Image & target, Image const& source, scaling_method_e scaling_method, - double scale_factor, + double image_ratio_x, + double image_ratio_y, double x_off_f=0, double y_off_f=0, - double filter_radius=2, - double ratio=1); + double filter_radius=2); template void scale_image_bilinear_old(Image & target, diff --git a/include/mapnik/image_util.hpp b/include/mapnik/image_util.hpp index 513a06416..8aa2415a3 100644 --- a/include/mapnik/image_util.hpp +++ b/include/mapnik/image_util.hpp @@ -64,11 +64,13 @@ 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_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_factor=1.0, + double scale_denominator=0.0); #endif template @@ -145,6 +147,12 @@ inline bool is_ps (std::string const& filename) return boost::algorithm::iends_with(filename,std::string(".ps")); } +inline bool is_webp (std::string const& filename) +{ + return boost::algorithm::iends_with(filename,std::string(".webp")); +} + + inline boost::optional type_from_filename(std::string const& filename) { @@ -155,6 +163,7 @@ inline boost::optional type_from_filename(std::string const& filena if (is_pdf(filename)) return result_type("pdf"); if (is_svg(filename)) return result_type("svg"); if (is_ps(filename)) return result_type("ps"); + if (is_webp(filename)) return result_type("webp"); return result_type(); } diff --git a/include/mapnik/image_view.hpp b/include/mapnik/image_view.hpp index 135125f79..b7bf54985 100644 --- a/include/mapnik/image_view.hpp +++ b/include/mapnik/image_view.hpp @@ -39,7 +39,7 @@ public: data_(data) { if (x_ >= data_.width()) x_=data_.width()-1; - if (y_ >= data_.height()) x_=data_.height()-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_; } @@ -88,6 +88,12 @@ public: { return data_.getRow(row + y_) + x_; } + + inline char const* getBytes() const + { + return reinterpret_cast(&data_); + } + inline T& data() { return data_; @@ -107,4 +113,3 @@ private: } #endif // MAPNIK_IMAGE_VIEW_HPP - diff --git a/include/mapnik/json/feature_collection_grammar.hpp b/include/mapnik/json/feature_collection_grammar.hpp index 2f6a20c03..43b8db635 100644 --- a/include/mapnik/json/feature_collection_grammar.hpp +++ b/include/mapnik/json/feature_collection_grammar.hpp @@ -87,7 +87,7 @@ struct feature_collection_grammar : > lit(']') ; - feature = eps[_a = construct(new_(ctx_,generate_id_()))] + feature = eps[_a = phoenix::construct(new_(ctx_,generate_id_()))] >> feature_g(*_a)[push_back(_r1,_a)] ; diff --git a/include/mapnik/json/feature_collection_parser.hpp b/include/mapnik/json/feature_collection_parser.hpp index 454d69a98..63473712e 100644 --- a/include/mapnik/json/feature_collection_parser.hpp +++ b/include/mapnik/json/feature_collection_parser.hpp @@ -40,16 +40,16 @@ namespace mapnik { namespace json { template struct feature_collection_grammar; template -class feature_collection_parser : private mapnik::noncopyable +class MAPNIK_DECL feature_collection_parser : private mapnik::noncopyable { typedef Iterator iterator_type; typedef mapnik::feature_impl feature_type; public: feature_collection_parser(mapnik::context_ptr const& ctx, mapnik::transcoder const& tr); ~feature_collection_parser(); - bool parse(iterator_type first, iterator_type last, std::vector & features); + bool parse(iterator_type first, iterator_type last, std::vector & features); private: - boost::scoped_ptr > grammar_; + boost::scoped_ptr > grammar_; }; }} diff --git a/include/mapnik/json/feature_grammar.hpp b/include/mapnik/json/feature_grammar.hpp index 18c2125e2..a117b53dc 100644 --- a/include/mapnik/json/feature_grammar.hpp +++ b/include/mapnik/json/feature_grammar.hpp @@ -133,6 +133,7 @@ struct feature_grammar : phoenix::function put_property_; phoenix::function extract_geometry_; + boost::phoenix::function where_message_; geometry_grammar geometry_grammar_; }; diff --git a/include/mapnik/json/geometry_grammar.hpp b/include/mapnik/json/geometry_grammar.hpp index 058950433..9600b4179 100644 --- a/include/mapnik/json/geometry_grammar.hpp +++ b/include/mapnik/json/geometry_grammar.hpp @@ -29,13 +29,11 @@ // spirit::qi #include -#include +#include 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; @@ -67,7 +65,7 @@ struct close_path void operator() (T path) const { BOOST_ASSERT( path!=0 ); - path->set_close(); + path->close_path(); } }; @@ -86,6 +84,25 @@ struct cleanup } }; +struct where_message +{ + template + struct result + { + typedef std::string type; + }; + + template + std::string operator() (Iterator first, Iterator last, std::size_t size) const + { + std::string str(first, last); + if (str.length() > size) + return str.substr(0, size) + "..." ; + return str; + } +}; + + template struct geometry_grammar : qi::grammar, void(boost::ptr_vector& ) @@ -120,6 +137,7 @@ struct geometry_grammar : boost::phoenix::function push_vertex_; boost::phoenix::function close_path_; boost::phoenix::function cleanup_; + boost::phoenix::function where_message_; }; }} diff --git a/include/mapnik/layer.hpp b/include/mapnik/layer.hpp index d546860d5..ca654fe9b 100644 --- a/include/mapnik/layer.hpp +++ b/include/mapnik/layer.hpp @@ -167,7 +167,7 @@ public: /*! * @param column Set the field rendering of this layer is grouped by. */ - void set_group_by(std::string column); + void set_group_by(std::string const& column); /*! * @return The field rendering of this layer is grouped by. diff --git a/include/mapnik/load_map.hpp b/include/mapnik/load_map.hpp index 231a8bd37..b269b83b5 100644 --- a/include/mapnik/load_map.hpp +++ b/include/mapnik/load_map.hpp @@ -32,7 +32,7 @@ namespace mapnik { -MAPNIK_DECL void load_map(Map & map, std::string const& filename, bool strict = false); +MAPNIK_DECL void load_map(Map & map, std::string const& filename, bool strict = false, std::string base_path=""); MAPNIK_DECL void load_map_string(Map & map, std::string const& str, bool strict = false, std::string base_path=""); } diff --git a/include/mapnik/map.hpp b/include/mapnik/map.hpp index 2be6bf3d1..fcf121832 100644 --- a/include/mapnik/map.hpp +++ b/include/mapnik/map.hpp @@ -112,14 +112,14 @@ public: * * @param rhs Map to copy from. */ - Map(const Map& rhs); + Map(Map const& rhs); /*! \brief Assignment operator * * TODO: to be documented * */ - Map& operator=(const Map& rhs); + Map& operator=(Map const& rhs); /*! \brief Get all styles * @return Const reference to styles @@ -201,13 +201,13 @@ public: /*! \brief Add a layer to the map. * @param l The layer to add. */ - void addLayer(const layer& l); + void addLayer(layer const& l); /*! \brief Get a layer. * @param index layer number. * @return Constant layer. */ - const layer& getLayer(size_t index) const; + layer const& getLayer(size_t index) const; /*! \brief Get a layer. * @param index layer number. @@ -267,7 +267,7 @@ public: /*! \brief Set the map background color. * @param c Background color. */ - void set_background(const color& c); + void set_background(color const& c); /*! \brief Get the map background color * @return Background color as boost::optional @@ -327,7 +327,7 @@ public: * Aspect is handled automatic if not fitting to width/height. * @param box The bounding box where to zoom. */ - void zoom_to_box(const box2d& box); + void zoom_to_box(box2d const& box); /*! \brief Zoom the map to show all data. */ @@ -340,7 +340,7 @@ public: /*! \brief Get current bounding box. * @return The current bounding box. */ - const box2d& get_current_extent() const; + box2d const& get_current_extent() const; /*! \brief Get current buffered bounding box. * @return The current buffered bounding box. diff --git a/include/mapnik/mapped_memory_cache.hpp b/include/mapnik/mapped_memory_cache.hpp index 6b53481c1..34151b2b6 100644 --- a/include/mapnik/mapped_memory_cache.hpp +++ b/include/mapnik/mapped_memory_cache.hpp @@ -41,12 +41,13 @@ using namespace boost::interprocess; typedef boost::shared_ptr mapped_region_ptr; -struct MAPNIK_DECL mapped_memory_cache : +class MAPNIK_DECL mapped_memory_cache : public singleton, private mapnik::noncopyable { friend class CreateStatic; boost::unordered_map cache_; +public: bool insert(std::string const& key, mapped_region_ptr); boost::optional find(std::string const& key, bool update_cache = false); void clear(); diff --git a/include/mapnik/marker.hpp b/include/mapnik/marker.hpp index aac1a3660..568f56550 100644 --- a/include/mapnik/marker.hpp +++ b/include/mapnik/marker.hpp @@ -100,17 +100,25 @@ public: 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; } diff --git a/include/mapnik/marker_helpers.hpp b/include/mapnik/marker_helpers.hpp index 707fbf2ab..f5bcce8fe 100644 --- a/include/mapnik/marker_helpers.hpp +++ b/include/mapnik/marker_helpers.hpp @@ -38,6 +38,7 @@ // agg #include "agg_ellipse.h" #include "agg_basics.h" +#include "agg_color_rgba.h" #include "agg_renderer_base.h" #include "agg_renderer_scanline.h" #include "agg_rendering_buffer.h" @@ -48,6 +49,7 @@ #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 @@ -69,7 +71,8 @@ struct vector_markers_rasterizer_dispatch agg::trans_affine const& marker_trans, markers_symbolizer const& sym, Detector & detector, - double scale_factor) + double scale_factor, + bool snap_to_pixels) : buf_(render_buffer), pixf_(buf_), renb_(pixf_), @@ -79,7 +82,8 @@ struct vector_markers_rasterizer_dispatch marker_trans_(marker_trans), sym_(sym), detector_(detector), - scale_factor_(scale_factor) + scale_factor_(scale_factor), + snap_to_pixels_(snap_to_pixels) { pixf_.comp_op(static_cast(sym_.comp_op())); } @@ -111,6 +115,13 @@ struct vector_markers_rasterizer_dispatch } agg::trans_affine matrix = marker_trans_; 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); + } + // TODO https://github.com/mapnik/mapnik/issues/1754 box2d transformed_bbox = bbox_ * matrix; if (sym_.get_allow_overlap() || @@ -132,7 +143,7 @@ struct vector_markers_rasterizer_dispatch double x = 0; double y = 0; double angle = 0; - while (placement.get_point(x, y, angle)) + while (placement.get_point(x, y, angle, sym_.get_ignore_placement())) { agg::trans_affine matrix = marker_trans_; matrix.rotate(angle); @@ -153,6 +164,7 @@ private: markers_symbolizer const& sym_; Detector & detector_; double scale_factor_; + bool snap_to_pixels_; }; template @@ -171,7 +183,8 @@ struct raster_markers_rasterizer_dispatch agg::trans_affine const& marker_trans, markers_symbolizer const& sym, Detector & detector, - double scale_factor) + double scale_factor, + bool snap_to_pixels) : buf_(render_buffer), pixf_(buf_), renb_(pixf_), @@ -180,7 +193,8 @@ struct raster_markers_rasterizer_dispatch marker_trans_(marker_trans), sym_(sym), detector_(detector), - scale_factor_(scale_factor) + scale_factor_(scale_factor), + snap_to_pixels_(snap_to_pixels) { pixf_.comp_op(static_cast(sym_.comp_op())); } @@ -232,7 +246,7 @@ struct raster_markers_rasterizer_dispatch sym_.get_max_error(), sym_.get_allow_overlap()); double x, y, angle; - while (placement.get_point(x, y, angle)) + while (placement.get_point(x, y, angle,sym_.get_ignore_placement())) { agg::trans_affine matrix = marker_trans_; matrix.rotate(angle); @@ -245,41 +259,66 @@ struct raster_markers_rasterizer_dispatch void render_raster_marker(agg::trans_affine const& marker_tr, double opacity) { + typedef agg::pixfmt_rgba32_pre pixfmt_pre; 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]); - agg::span_allocator sa; - agg::image_filter_bilinear filter_kernel; - agg::image_filter_lut filter(filter_kernel, false); - agg::rendering_buffer marker_buf((unsigned char *)src_.getBytes(), - src_.width(), - src_.height(), - src_.width()*4); - agg::pixfmt_rgba32_pre pixf(marker_buf); - typedef agg::image_accessor_clone img_accessor_type; - typedef agg::span_interpolator_linear interpolator_type; - typedef agg::span_image_filter_rgba_2x2 span_gen_type; - typedef agg::renderer_scanline_aa_alpha, - span_gen_type> renderer_type; - img_accessor_type ia(pixf); - interpolator_type interpolator(agg::trans_affine(p, 0, 0, width, height) ); - span_gen_type sg(ia, interpolator, filter); - renderer_type rp(renb_,sa, sg, unsigned(opacity*255)); - agg::render_scanlines(ras_, sl_, rp); + 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); + renb_.blend_from(pixf_mask, + 0, + std::floor(marker_tr.tx + .5), + std::floor(marker_tr.ty + .5), + unsigned(255*sym_.get_opacity())); + } + else + { + typedef agg::image_accessor_clone img_accessor_type; + typedef agg::span_interpolator_linear<> interpolator_type; + //typedef agg::span_image_filter_rgba_2x2 span_gen_type; + typedef agg::span_image_resample_rgba_affine span_gen_type; + typedef agg::renderer_scanline_aa_alpha, + span_gen_type> renderer_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 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); + } } private: @@ -293,6 +332,7 @@ private: markers_symbolizer const& sym_; Detector & detector_; double scale_factor_; + bool snap_to_pixels_; }; @@ -327,6 +367,8 @@ void build_ellipse(T const& sym, mapnik::feature_impl const& feature, svg_storag styled_svg.pop_attr(); double lox,loy,hix,hiy; styled_svg.bounding_rect(&lox, &loy, &hix, &hiy); + styled_svg.set_dimensions(width,height); + marker_ellipse.set_dimensions(width,height); marker_ellipse.set_bounding_box(lox,loy,hix,hiy); } @@ -381,7 +423,11 @@ bool push_explicit_style(Attr const& src, Attr & dst, markers_symbolizer const& } template -void setup_transform_scaling(agg::trans_affine & tr, box2d const& bbox, mapnik::feature_impl const& feature, T const& sym) +void setup_transform_scaling(agg::trans_affine & tr, + double svg_width, + double svg_height, + mapnik::feature_impl const& feature, + T const& sym) { double width = 0; double height = 0; @@ -396,18 +442,18 @@ void setup_transform_scaling(agg::trans_affine & tr, box2d const& bbox, if (width > 0 && height > 0) { - double sx = width/bbox.width(); - double sy = height/bbox.height(); + double sx = width/svg_width; + double sy = height/svg_height; tr *= agg::trans_affine_scaling(sx,sy); } else if (width > 0) { - double sx = width/bbox.width(); + double sx = width/svg_width; tr *= agg::trans_affine_scaling(sx); } else if (height > 0) { - double sy = height/bbox.height(); + double sy = height/svg_height; tr *= agg::trans_affine_scaling(sy); } } diff --git a/include/mapnik/markers_placement.hpp b/include/mapnik/markers_placement.hpp index ca22863b8..7f0a1bd60 100644 --- a/include/mapnik/markers_placement.hpp +++ b/include/mapnik/markers_placement.hpp @@ -107,10 +107,10 @@ public: * \param x Return value for x position * \param y Return value for x position * \param angle Return value for rotation angle - * \param add_to_detector Add selected position to detector + * \param ignore_placement Whether to add selected position to detector * \return True if a place is found, false if none is found. */ - bool get_point(double & x, double & y, double & angle, bool add_to_detector = true) + bool get_point(double & x, double & y, double & angle, bool ignore_placement) { if (done_) { @@ -151,10 +151,9 @@ public: //Error for this marker is too large. Skip to the next position. if (std::fabs(error_) > max_err_allowed) { - if (error_ > spacing_) + while (error_ > spacing_) { - MAPNIK_LOG_WARN(markers_placement) << "Extremely large error (" << error_ << ") in markers_placement. Please file a bug report."; - error_ = 0.0; //Avoid moving backwards + error_ -= spacing_; //Avoid moving backwards } spacing_left_ += spacing_ - error_; error_ = 0.0; @@ -174,7 +173,7 @@ public: last_x = next_x; last_y = next_y; } - if (agg::is_stop(cmd)) + if (agg::is_stop(cmd) || cmd == SEG_CLOSE) { done_ = true; return false; @@ -220,7 +219,10 @@ public: set_spacing_left(spacing_left_ + spacing_ * max_error_ / 10.0); //Only moves forward continue; } - if (add_to_detector) detector_.insert(box); + if (!ignore_placement) + { + detector_.insert(box); + } last_x = x; last_y = y; return true; diff --git a/include/mapnik/memory_featureset.hpp b/include/mapnik/memory_featureset.hpp index 13ab3d4cf..f334b1d5e 100644 --- a/include/mapnik/memory_featureset.hpp +++ b/include/mapnik/memory_featureset.hpp @@ -24,13 +24,14 @@ #define MAPNIK_MEMORY_FEATURESET_HPP // mapnik +#include +#include #include #include #include #include -// boost -#include +#include namespace mapnik { diff --git a/include/mapnik/palette.hpp b/include/mapnik/palette.hpp index 3598a2b08..972cf56e3 100644 --- a/include/mapnik/palette.hpp +++ b/include/mapnik/palette.hpp @@ -34,7 +34,6 @@ #include typedef google::dense_hash_map rgba_hash_table; #else - #warning compiling without dense_hash_map #include typedef boost::unordered_map rgba_hash_table; #endif diff --git a/include/mapnik/params_impl.hpp b/include/mapnik/params_impl.hpp index 9d64f0b90..a39e55cfc 100644 --- a/include/mapnik/params_impl.hpp +++ b/include/mapnik/params_impl.hpp @@ -35,8 +35,11 @@ #include #include #include + // stl #include +#include + namespace mapnik { namespace detail { @@ -44,7 +47,7 @@ namespace mapnik { namespace detail { template struct extract_value { - static inline boost::optional do_extract_from_string(std::string const& source) + static inline boost::optional do_extract_from_string(std::string const& /*source*/) { std::string err_msg = (boost::format("No conversion from std::string to %s") % typeid(T).name()).str(); throw std::runtime_error(err_msg); @@ -148,16 +151,17 @@ struct value_extractor_visitor : public boost::static_visitor<> template void operator () (T1 val) const { - // TODO try { var_ = boost::lexical_cast(val); } - catch (boost::bad_lexical_cast & ) {} - //std::string err_msg = (boost::format("No conversion from %s to %s") - // % typeid(T1).name() - // % typeid(T).name()).str(); - //throw std::runtime_error(err_msg); + catch (boost::bad_lexical_cast const& ) + { + std::string err_msg = (boost::format("Failed converting from %s to %s") + % typeid(T1).name() + % typeid(T).name()).str(); + throw std::runtime_error(err_msg); + } } diff --git a/include/mapnik/parse_path.hpp b/include/mapnik/parse_path.hpp index d260bbf2c..f3d65c5e5 100644 --- a/include/mapnik/parse_path.hpp +++ b/include/mapnik/parse_path.hpp @@ -41,7 +41,7 @@ MAPNIK_DECL path_expression_ptr parse_path(std::string const & str); MAPNIK_DECL path_expression_ptr parse_path(std::string const & str, path_expression_grammar const& g); -struct path_processor +struct MAPNIK_DECL path_processor { static std::string evaluate(path_expression const& path, feature_impl const& f); static std::string to_string(path_expression const& path); diff --git a/include/mapnik/pixel_position.hpp b/include/mapnik/pixel_position.hpp index d29fc2919..1ac537e45 100644 --- a/include/mapnik/pixel_position.hpp +++ b/include/mapnik/pixel_position.hpp @@ -22,7 +22,7 @@ #ifndef MAPNIK_PIXEL_POSITION_HPP #define MAPNIK_PIXEL_POSITION_HPP -/** Store a pixel position. */ +// Store a pixel position. struct pixel_position { double x; diff --git a/include/mapnik/placement_finder.hpp b/include/mapnik/placement_finder.hpp index 1c5f67c10..ad14c6936 100644 --- a/include/mapnik/placement_finder.hpp +++ b/include/mapnik/placement_finder.hpp @@ -33,11 +33,9 @@ #include #include - // agg #include "agg_conv_clip_polyline.h" - // stl #include @@ -59,27 +57,26 @@ template class placement_finder : mapnik::noncopyable { public: - placement_finder(feature_impl const& feature, - text_placement_info const& placement_info, + placement_finder(text_placement_info const& placement_info, string_info const& info, DetectorT & detector, box2d const& extent); - /** Try place a single label at the given point. */ + // Try place a single label at the given point. */ void find_point_placement(double pos_x, double pos_y, double angle=0.0); - /** Iterate over the given path, placing point labels with respect to label_spacing. */ + // Iterate over the given path, placing point labels with respect to label_spacing. */ template void find_point_placements(T & path); - /** Iterate over the given path, placing line-following labels with respect to label_spacing. */ + // Iterate over the given path, placing line-following labels with respect to label_spacing. */ template void find_line_placements(T & path); - /** Add placements to detector. */ + // Add placements to detector. */ void update_detector(); - /** Remove old placements. */ + // Remove old placements. */ void clear_placements(); inline placements_type const& get_results() { return placements_; } @@ -134,17 +131,14 @@ private: string_info const& info_; text_symbolizer_properties const& p; text_placement_info const& pi; - /** Length of the longest line after linebreaks. - * Before find_line_breaks() this is the total length of the string. - */ + // Length of the longest line after linebreaks. + // Before find_line_breaks() this is the total length of the string. double string_width_; - /** Height of the string after linebreaks. - * Before find_line_breaks() this is the total length of the string. - */ + // Height of the string after linebreaks. + // Before find_line_breaks() this is the total length of the string. double string_height_; - /** Height of the tallest font in the first line not including line spacing. - * Used to determine the correct offset for the first line. - */ + // Height of the tallest font in the first line not including line spacing. + // Used to determine the correct offset for the first line. double first_line_space_; vertical_alignment_e valign_; horizontal_alignment_e halign_; @@ -152,18 +146,17 @@ private: std::vector line_breaks_; std::vector > line_sizes_; std::queue< box2d > envelopes_; - /** Used to return all placements found. */ + // Used to return all placements found. */ placements_type placements_; - /** Bounding box of all texts placed. */ + // Bounding box of all texts placed. */ box2d extents_; - /** Collect a bounding box of all texts placed. */ + // Collect a bounding box of all texts placed. */ bool collect_extents_; - /** Additional boxes to take into account when finding placement. - * Used for finding line placements where multiple placements are returned. - * Boxes are relative to starting point of current placement. - * Only used for point placements! - */ + // Additional boxes to take into account when finding placement. + // Used for finding line placements where multiple placements are returned. + // Boxes are relative to starting point of current placement. + // Only used for point placements! std::vector > additional_boxes_; }; } diff --git a/include/mapnik/plugin.hpp b/include/mapnik/plugin.hpp index 8058f1483..caf55d021 100644 --- a/include/mapnik/plugin.hpp +++ b/include/mapnik/plugin.hpp @@ -29,21 +29,29 @@ // stl #include -// ltdl -#include - namespace mapnik { + +// Opaque structure for handle +typedef struct _mapnik_lib_t mapnik_lib_t; + class PluginInfo : mapnik::noncopyable { -private: - std::string name_; - lt_dlhandle module_; public: - PluginInfo (std::string const& name,const lt_dlhandle module); + typedef const char * name_func(); + PluginInfo (std::string const& filename, + std::string const& library_name); ~PluginInfo(); std::string const& name() const; - lt_dlhandle handle() const; + bool valid() const; + std::string get_error() const; + void * get_symbol(std::string const& sym_name) const; + static void init(); + static void exit(); +private: + std::string filename_; + std::string name_; + mapnik_lib_t * module_; }; } diff --git a/include/mapnik/polygon_clipper.hpp b/include/mapnik/polygon_clipper.hpp new file mode 100644 index 000000000..7bcb65b85 --- /dev/null +++ b/include/mapnik/polygon_clipper.hpp @@ -0,0 +1,237 @@ +/***************************************************************************** + * + * 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 +#include + +// mapnik +#include +#include + +// boost +#include +#include +#include +#include +#include +#include +#include + +BOOST_GEOMETRY_REGISTER_POINT_2D(mapnik::coord2d, double, cs::cartesian, x, y) + +// register mapnik::box2d +namespace boost { namespace geometry { namespace traits +{ + +template<> struct tag > { typedef box_tag type; }; + +template<> struct point_type > { typedef mapnik::coord2d type; }; + +template <> +struct indexed_access, min_corner, 0> +{ + typedef coordinate_type::type ct; + static inline ct get(mapnik::box2d const& b) { return b.minx();} + static inline void set(mapnik::box2d &b, ct const& value) { b.set_minx(value); } +}; + +template <> +struct indexed_access, min_corner, 1> +{ + typedef coordinate_type::type ct; + static inline ct get(mapnik::box2d const& b) { return b.miny();} + static inline void set(mapnik::box2d &b, ct const& value) { b.set_miny(value); } +}; + +template <> +struct indexed_access, max_corner, 0> +{ + typedef coordinate_type::type ct; + static inline ct get(mapnik::box2d const& b) { return b.maxx();} + static inline void set(mapnik::box2d &b, ct const& value) { b.set_maxx(value); } +}; + +template <> +struct indexed_access, max_corner, 1> +{ + typedef coordinate_type::type ct; + static inline ct get(mapnik::box2d const& b) { return b.maxy();} + static inline void set(mapnik::box2d &b , ct const& value) { b.set_maxy(value); } +}; + +}}} + +namespace mapnik { + +using namespace boost::geometry; + +template +struct polygon_clipper +{ + typedef mapnik::coord2d point_2d; + typedef model::polygon polygon_2d; + typedef std::deque polygon_list; + + polygon_clipper(Geometry & geom) + : clip_box_(), + geom_(geom) + { + + } + + polygon_clipper( box2d const& clip_box,Geometry & geom) + : clip_box_(clip_box), + geom_(geom) + { + init(); + } + + void set_clip_box(box2d const& clip_box) + { + clip_box_ = clip_box; + init(); + } + + unsigned type() const + { + return geom_.type(); + } + + void rewind(unsigned path_id) + { + output_.rewind(path_id); + } + + unsigned vertex (double * x, double * y) + { + return output_.vertex(x,y); + } + +private: + + void init() + { + polygon_2d subject_poly; + double x,y; + double prev_x, prev_y; + 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(x,y)); + } + else + { + subject_poly.inners().push_back(polygon_2d::inner_container_type::value_type()); + append(subject_poly.inners().back(),make(x,y)); + } + ++ring_count; + } + else if (cmd == SEG_LINETO) + { + if (std::abs(x - prev_x) < 1e-12 && std::abs(y - prev_y) < 1e-12) + { + std::cerr << std::setprecision(12) << "coincident vertices:(" << prev_x << "," + << prev_y << ") , (" << x << "," << y << ")" << std::endl; + continue; + } + prev_x = x; + prev_x = y; + if (ring_count == 1) + { + append(subject_poly, make(x,y)); + } + else + { + append(subject_poly.inners().back(),make(x,y)); + } + } + } + + polygon_list clipped_polygons; + + try + { + boost::geometry::intersection(clip_box_, subject_poly, clipped_polygons); + } + catch (boost::geometry::exception const& ex) + { + std::cerr << ex.what() << std::endl; + } + + BOOST_FOREACH(polygon_2d const& poly, clipped_polygons) + { + bool move_to = true; + BOOST_FOREACH(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 + BOOST_FOREACH(polygon_2d::inner_container_type::value_type const& ring, boost::geometry::interior_rings(poly)) + { + move_to = true; + BOOST_FOREACH(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 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 fe0572687..ba22cd7fa 100644 --- a/include/mapnik/pool.hpp +++ b/include/mapnik/pool.hpp @@ -42,28 +42,6 @@ namespace mapnik { -template -class PoolGuard -{ -private: - const T& obj_; - PoolT& pool_; -public: - explicit PoolGuard(const T& ptr,PoolT& pool) - : obj_(ptr), - pool_(pool) {} - - ~PoolGuard() - { - pool_->returnObject(obj_); - } - -private: - PoolGuard(); - PoolGuard(const PoolGuard&); - PoolGuard& operator=(const PoolGuard&); -}; - template class Creator> class Pool : private mapnik::noncopyable { @@ -73,8 +51,7 @@ class Pool : private mapnik::noncopyable Creator creator_; unsigned initialSize_; unsigned maxSize_; - ContType usedPool_; - ContType unusedPool_; + ContType pool_; #ifdef MAPNIK_THREADSAFE mutable boost::mutex mutex_; #endif @@ -89,7 +66,7 @@ public: { HolderType conn(creator_()); if (conn->isOK()) - unusedPool_.push_back(conn); + pool_.push_back(conn); } } @@ -98,31 +75,33 @@ public: #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mutex_); #endif - typename ContType::iterator itr=unusedPool_.begin(); - while ( itr!=unusedPool_.end()) - { - MAPNIK_LOG_DEBUG(pool) << "pool: Borrow instance=" << (*itr).get(); - if ((*itr)->isOK()) + typename ContType::iterator itr=pool_.begin(); + while ( itr!=pool_.end()) + { + if (!itr->unique()) { - usedPool_.push_back(*itr); - unusedPool_.erase(itr); - return usedPool_.back(); + ++itr; + } + else if ((*itr)->isOK()) + { + MAPNIK_LOG_DEBUG(pool) << "pool: Borrow instance=" << (*itr).get(); + return *itr; } else { MAPNIK_LOG_DEBUG(pool) << "pool: Bad connection (erase) instance=" << (*itr).get(); - itr=unusedPool_.erase(itr); + itr=pool_.erase(itr); } } // all connection have been taken, check if we allowed to grow pool - if (usedPool_.size() < maxSize_) + if (pool_.size() < maxSize_) { HolderType conn(creator_()); if (conn->isOK()) { - usedPool_.push_back(conn); + pool_.push_back(conn); MAPNIK_LOG_DEBUG(pool) << "pool: Create connection=" << conn.get(); @@ -132,33 +111,12 @@ public: return HolderType(); } - void returnObject(HolderType obj) + unsigned size() const { #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mutex_); #endif - typename ContType::iterator itr=usedPool_.begin(); - while (itr != usedPool_.end()) - { - if (obj.get()==(*itr).get()) - { - MAPNIK_LOG_DEBUG(pool) << "pool: Return instance=" << (*itr).get(); - - unusedPool_.push_back(*itr); - usedPool_.erase(itr); - return; - } - ++itr; - } - } - - std::pair size() const - { -#ifdef MAPNIK_THREADSAFE - mutex::scoped_lock lock(mutex_); -#endif - std::pair size(unusedPool_.size(),usedPool_.size()); - return size; + return pool_.size(); } unsigned max_size() const @@ -193,7 +151,7 @@ public: if (size > initialSize_) { initialSize_ = size; - unsigned total_size = usedPool_.size() + unusedPool_.size(); + unsigned total_size = pool_.size(); // ensure we don't have ghost obj's in the pool. if (total_size < initialSize_) { @@ -203,7 +161,7 @@ public: { HolderType conn(creator_()); if (conn->isOK()) - unusedPool_.push_back(conn); + pool_.push_back(conn); } } } diff --git a/include/mapnik/processed_text.hpp b/include/mapnik/processed_text.hpp index 5e2c7dc5a..5219a6785 100644 --- a/include/mapnik/processed_text.hpp +++ b/include/mapnik/processed_text.hpp @@ -37,14 +37,13 @@ namespace mapnik class freetype_engine; template class face_manager; -class processed_text : mapnik::noncopyable +class MAPNIK_DECL processed_text : mapnik::noncopyable { public: - class processed_expression + struct processed_expression { - public: - processed_expression(char_properties const& properties, UnicodeString const& text) : - p(properties), str(text) {} + processed_expression(char_properties const& properties, UnicodeString const& text) + : p(properties), str(text) {} char_properties p; UnicodeString str; }; @@ -57,7 +56,7 @@ public: typedef std::list expression_list; expression_list::const_iterator begin() const; expression_list::const_iterator end() const; - string_info &get_string_info(); + string_info const& get_string_info(); private: expression_list expr_list_; face_manager &font_manager_; diff --git a/include/mapnik/projection.hpp b/include/mapnik/projection.hpp index e7c846bee..238280a7b 100644 --- a/include/mapnik/projection.hpp +++ b/include/mapnik/projection.hpp @@ -76,6 +76,15 @@ private: mutable void * proj_ctx_; }; +template +std::basic_ostream & +operator << ( std::basic_ostream & s, mapnik::projection const& p ) +{ + s << "projection(\"" << p.params() << "\")"; + return s; +} + + } #endif // MAPNIK_PROJECTION_HPP diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp index 806af3602..76c09fd94 100644 --- a/include/mapnik/raster_colorizer.hpp +++ b/include/mapnik/raster_colorizer.hpp @@ -40,7 +40,6 @@ // mapnik #include #include -#include #include // boost @@ -52,6 +51,10 @@ namespace mapnik { +class feature_impl; +class raster; + + //! \brief Enumerates the modes of interpolation enum colorizer_mode_enum { @@ -197,7 +200,7 @@ public: //! //! \param[in, out] raster A raster stored in float32 single channel format, which gets colorized in place. //! \param[in] f The feature used to find 'NODATA' information if available - void colorize(raster_ptr const& raster, Feature const& f) const; + void colorize(boost::shared_ptr const& raster, feature_impl const& f) const; //! \brief Perform the translation of input to output diff --git a/include/mapnik/request.hpp b/include/mapnik/request.hpp new file mode 100644 index 000000000..9a4b99cf0 --- /dev/null +++ b/include/mapnik/request.hpp @@ -0,0 +1,60 @@ +/***************************************************************************** + * + * 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_REQUEST_HPP +#define MAPNIK_REQUEST_HPP + +// mapnik +#include +#include + +// boost +#include + +namespace mapnik +{ + +class MAPNIK_DECL request +{ +public: + request(unsigned width, + unsigned height, + box2d const& extent); + unsigned width() const; + unsigned height() const; + void set_buffer_size(int buffer_size); + int buffer_size() const; + box2d const& extent() const; + void set_extent(box2d const& box); + box2d get_buffered_extent() const; + double scale() const; + ~request(); +private: + unsigned width_; + unsigned height_; + box2d extent_; + int buffer_size_; +}; + +} + +#endif // MAPNIK_REQUEST_HPP diff --git a/include/mapnik/simplify_converter.hpp b/include/mapnik/simplify_converter.hpp index 8aab345cc..2346a71a9 100644 --- a/include/mapnik/simplify_converter.hpp +++ b/include/mapnik/simplify_converter.hpp @@ -1,19 +1,22 @@ #ifndef MAPNIK_SIMPLIFY_CONVERTER_HPP #define MAPNIK_SIMPLIFY_CONVERTER_HPP +// mapnik #include #include #include #include #include -// STL +// stl #include #include #include #include #include -// Boost +#include + +// boost #include namespace mapnik diff --git a/include/mapnik/svg/output/svg_generator.hpp b/include/mapnik/svg/output/svg_generator.hpp index bd5b3fffd..30f077a42 100644 --- a/include/mapnik/svg/output/svg_generator.hpp +++ b/include/mapnik/svg/output/svg_generator.hpp @@ -31,6 +31,7 @@ #include #include #include +#include namespace mapnik { namespace svg { @@ -57,6 +58,9 @@ namespace mapnik { namespace svg { void generate_opening_root(root_output_attributes const& root_attributes); void generate_closing_root(); void generate_rect(rect_output_attributes const& rect_attributes); + void generate_opening_group(mapnik::value_integer val); + void generate_opening_group(std::string const& val); + void generate_closing_group(); template void generate_path(PathType const& path, path_output_attributes const& path_attributes) { diff --git a/include/mapnik/svg/output/svg_output_grammars.hpp b/include/mapnik/svg/output/svg_output_grammars.hpp index 0bafa6599..c512e0582 100644 --- a/include/mapnik/svg/output/svg_output_grammars.hpp +++ b/include/mapnik/svg/output/svg_output_grammars.hpp @@ -172,7 +172,8 @@ struct svg_root_attributes_grammar : karma::grammar svg_root_attributes; diff --git a/include/mapnik/svg/output/svg_renderer.hpp b/include/mapnik/svg/output/svg_renderer.hpp index 0dbbfd3bb..1e98fee09 100644 --- a/include/mapnik/svg/output/svg_renderer.hpp +++ b/include/mapnik/svg/output/svg_renderer.hpp @@ -36,6 +36,7 @@ #include // for CoordTransform #include // for composite_mode_e #include +#include // boost #include @@ -70,15 +71,16 @@ class MAPNIK_DECL svg_renderer : public feature_style_processor processor_impl_type; - svg_renderer(Map const& m, OutputIterator& output_iterator, unsigned offset_x=0, unsigned offset_y=0); + svg_renderer(Map const& m, OutputIterator& output_iterator, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + svg_renderer(Map const& m, request const& req, OutputIterator& output_iterator, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); ~svg_renderer(); void start_map_processing(Map const& map); void end_map_processing(Map const& map); void start_layer_processing(layer const& lay, box2d const& query_extent); void end_layer_processing(layer const& lay); - void start_style_processing(feature_type_style const& st) {} - void end_style_processing(feature_type_style const& st) {} + void start_style_processing(feature_type_style const& /*st*/) {} + void end_style_processing(feature_type_style const& /*st*/) {} /*! * @brief Overloads that process each kind of symbolizer individually. @@ -113,9 +115,9 @@ public: void process(markers_symbolizer const& sym, mapnik::feature_impl & feature, proj_transform const& prj_trans); - void process(debug_symbolizer const& sym, - mapnik::feature_impl & feature, - proj_transform const& prj_trans) {} + void process(debug_symbolizer const& /*sym*/, + mapnik::feature_impl & /*feature*/, + proj_transform const& /*prj_trans*/) {} /*! * @brief Overload that process the whole set of symbolizers of a rule. @@ -125,7 +127,7 @@ public: mapnik::feature_impl & feature, proj_transform const& prj_trans); - void painted(bool painted) + void painted(bool /*painted*/) { // nothing to do } @@ -135,6 +137,11 @@ public: return DEFAULT; } + inline double scale_factor() const + { + return scale_factor_; + } + inline OutputIterator& get_output_iterator() { return output_iterator_; @@ -149,9 +156,13 @@ private: OutputIterator& output_iterator_; const int width_; const int height_; + double scale_factor_; CoordTransform t_; - svg::svg_generator generator_; svg::path_output_attributes path_attributes_; + freetype_engine font_engine_; + face_manager font_manager_; + boost::shared_ptr detector_; + svg::svg_generator generator_; box2d query_extent_; bool painted_; diff --git a/include/mapnik/svg/svg_converter.hpp b/include/mapnik/svg/svg_converter.hpp index d67c6c2ca..2ccf9da56 100644 --- a/include/mapnik/svg/svg_converter.hpp +++ b/include/mapnik/svg/svg_converter.hpp @@ -264,6 +264,7 @@ public: { cur_attr().fill_opacity = op; } + void stroke_opacity(double op) { cur_attr().stroke_opacity = op; @@ -271,8 +272,7 @@ public: void opacity(double op) { - cur_attr().stroke_opacity = op; - cur_attr().fill_opacity = op; + cur_attr().opacity = op; } void line_join(agg::line_join_e join) @@ -308,6 +308,22 @@ public: agg::bounding_rect(trans, *this, 0, attributes_.size(), x1, y1, x2, y2); } + void set_dimensions(double w, double h) + { + svg_width_ = w; + svg_height_ = h; + } + + double width() + { + return svg_width_; + } + + double height() + { + return svg_height_; + } + VertexSource & storage() { return source_; @@ -333,6 +349,8 @@ private: AttributeSource & attributes_; AttributeSource attr_stack_; agg::trans_affine transform_; + double svg_width_; + double svg_height_; }; diff --git a/include/mapnik/svg/svg_parser.hpp b/include/mapnik/svg/svg_parser.hpp index 68f151bf2..0806aa233 100644 --- a/include/mapnik/svg/svg_parser.hpp +++ b/include/mapnik/svg/svg_parser.hpp @@ -30,9 +30,6 @@ #include #include -// boost -#include - // stl #include @@ -45,33 +42,13 @@ namespace mapnik { namespace svg { ~svg_parser(); void parse(std::string const& filename); void parse_from_string(std::string const& svg); - private: - bool parse_reader(xmlTextReaderPtr reader); - void process_node(xmlTextReaderPtr reader); - void start_element(xmlTextReaderPtr reader); - void end_element(xmlTextReaderPtr reader); - void parse_path(xmlTextReaderPtr reader); - void parse_polygon(xmlTextReaderPtr reader); - void parse_polyline(xmlTextReaderPtr reader); - void parse_line(xmlTextReaderPtr reader); - void parse_rect(xmlTextReaderPtr reader); - void parse_circle(xmlTextReaderPtr reader); - void parse_ellipse(xmlTextReaderPtr reader); - void parse_linear_gradient(xmlTextReaderPtr reader); - void parse_radial_gradient(xmlTextReaderPtr reader); - bool parse_common_gradient(xmlTextReaderPtr reader); - void parse_gradient_stop(xmlTextReaderPtr reader); - void parse_pattern(xmlTextReaderPtr reader); - void parse_attr(xmlTextReaderPtr reader); - void parse_attr(const xmlChar * name, const xmlChar * value ); - private: svg_converter_type & path_; bool is_defs_; std::map gradient_map_; std::pair temporary_gradient_; }; - }} +}} #endif // MAPNIK_SVG_PARSER_HPP diff --git a/include/mapnik/svg/svg_path_attributes.hpp b/include/mapnik/svg/svg_path_attributes.hpp index db14ccc28..831fd1f5a 100644 --- a/include/mapnik/svg/svg_path_attributes.hpp +++ b/include/mapnik/svg/svg_path_attributes.hpp @@ -26,7 +26,6 @@ // agg #include "agg_math_stroke.h" #include "agg_color_rgba.h" -#include "agg_pixfmt_rgba.h" #include "agg_trans_affine.h" // mapnik @@ -38,6 +37,7 @@ namespace svg { struct path_attributes { unsigned index; + double opacity; agg::rgba8 fill_color; double fill_opacity; agg::rgba8 stroke_color; @@ -58,6 +58,7 @@ struct path_attributes // Empty constructor path_attributes() : index(0), + opacity(1.0), fill_color(agg::rgba(0,0,0)), fill_opacity(1.0), stroke_color(agg::rgba(0,0,0)), @@ -80,6 +81,7 @@ struct path_attributes // Copy constructor path_attributes(const path_attributes& attr) : index(attr.index), + opacity(attr.opacity), fill_color(attr.fill_color), fill_opacity(attr.fill_opacity), stroke_color(attr.stroke_color), @@ -101,6 +103,7 @@ struct path_attributes // Copy constructor with new index value path_attributes(path_attributes const& attr, unsigned idx) : index(idx), + opacity(attr.opacity), fill_color(attr.fill_color), fill_opacity(attr.fill_opacity), stroke_color(attr.stroke_color), diff --git a/include/mapnik/svg/svg_renderer_agg.hpp b/include/mapnik/svg/svg_renderer_agg.hpp index 5d0032e9b..cf76e0a99 100644 --- a/include/mapnik/svg/svg_renderer_agg.hpp +++ b/include/mapnik/svg/svg_renderer_agg.hpp @@ -27,7 +27,11 @@ #include #include #include + +#if defined(GRID_RENDERER) #include +#endif + #include // boost @@ -52,7 +56,6 @@ #include "agg_gradient_lut.h" #include "agg_gamma_lut.h" #include "agg_span_interpolator_linear.h" -#include "agg_pixfmt_rgba.h" namespace mapnik { namespace svg { @@ -119,11 +122,12 @@ public: void render_gradient(Rasterizer& ras, Scanline& sl, Renderer& ren, - const gradient &grad, + gradient const& grad, agg::trans_affine const& mtx, double opacity, - const box2d &symbol_bbox, - const box2d &path_bbox) + box2d const& symbol_bbox, + curved_trans_type & curved_trans, + unsigned path_id) { typedef agg::gamma_lut gamma_lut_type; typedef agg::gradient_lut, 1024> color_func_type; @@ -165,17 +169,13 @@ public: if (grad.get_units() == OBJECT_BOUNDING_BOX) { - bx1=path_bbox.minx(); - by1=path_bbox.miny(); - bx2=path_bbox.maxx(); - by2=path_bbox.maxy(); + bounding_rect_single(curved_trans, path_id, &bx1, &by1, &bx2, &by2); } transform.translate(-bx1,-by1); transform.scale(1.0/(bx2-bx1),1.0/(by2-by1)); } - if (grad.get_gradient_type() == RADIAL) { typedef agg::gradient_radial_focus gradient_adaptor_type; @@ -261,10 +261,6 @@ public: transform = attr.transform; - double bx1,by1,bx2,by2; - bounding_rect_single(curved_trans, attr.index, &bx1, &by1, &bx2, &by2); - box2d path_bbox(bx1,by1,bx2,by2); - transform *= mtx; double scl = transform.scale(); //curved_.approximation_method(curve_inc); @@ -290,13 +286,13 @@ public: if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT) { - render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.fill_opacity * opacity, symbol_bbox, path_bbox); + render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.fill_opacity * attr.opacity * opacity, symbol_bbox, curved_trans, attr.index); } else { ras.filling_rule(attr.even_odd_flag ? fill_even_odd : fill_non_zero); color = attr.fill_color; - color.opacity(color.opacity() * attr.fill_opacity * opacity); + color.opacity(color.opacity() * attr.fill_opacity * attr.opacity * opacity); ScanlineRenderer ren_s(ren); color.premultiply(); ren_s.color(color); @@ -326,13 +322,13 @@ public: if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT) { - render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.stroke_opacity * opacity, symbol_bbox, path_bbox); + render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.stroke_opacity * attr.opacity * opacity, symbol_bbox, curved_trans, attr.index); } else { ras.filling_rule(fill_non_zero); color = attr.stroke_color; - color.opacity(color.opacity() * attr.stroke_opacity * opacity); + color.opacity(color.opacity() * attr.stroke_opacity * attr.opacity * opacity); ScanlineRenderer ren_s(ren); color.premultiply(); ren_s.color(color); @@ -342,14 +338,15 @@ public: } } +#if defined(GRID_RENDERER) template void render_id(Rasterizer& ras, Scanline& sl, Renderer& ren, int feature_id, agg::trans_affine const& mtx, - double opacity, - const box2d &symbol_bbox) + double /*opacity*/, + box2d const& /*symbol_bbox*/) { using namespace agg; @@ -369,10 +366,6 @@ public: transform = attr.transform; - double bx1,by1,bx2,by2; - bounding_rect_single(curved_trans, attr.index, &bx1, &by1, &bx2, &by2); - box2d path_bbox(bx1,by1,bx2,by2); - transform *= mtx; double scl = transform.scale(); //curved_.approximation_method(curve_inc); @@ -428,6 +421,7 @@ public: } } } +#endif private: diff --git a/include/mapnik/svg/svg_storage.hpp b/include/mapnik/svg/svg_storage.hpp index a0827972a..89e6ebca4 100644 --- a/include/mapnik/svg/svg_storage.hpp +++ b/include/mapnik/svg/svg_storage.hpp @@ -34,7 +34,9 @@ template class svg_storage : mapnik::noncopyable { public: - svg_storage() {} + svg_storage() : + svg_width_(0), + svg_height_(0) {} VertexSource & source() // FIXME!! make const { @@ -61,11 +63,29 @@ public: return bounding_box_; } + double width() const + { + return svg_width_; + } + + double height() const + { + return svg_height_; + } + + void set_dimensions(double w, double h) + { + svg_width_ = w; + svg_height_ = h; + } + private: VertexSource source_; AttributeSource attributes_; box2d bounding_box_; + double svg_width_; + double svg_height_; }; diff --git a/include/mapnik/symbolizer_hash.hpp b/include/mapnik/symbolizer_hash.hpp index 795743402..db89ff8a9 100644 --- a/include/mapnik/symbolizer_hash.hpp +++ b/include/mapnik/symbolizer_hash.hpp @@ -34,10 +34,9 @@ namespace mapnik { struct symbolizer_hash { template - static std::size_t value(T const& sym) + static std::size_t value(T const& /*sym*/) { - std::size_t seed = 0; - return seed; + return 0; } // specialisation for polygon_symbolizer static std::size_t value(polygon_symbolizer const& sym) diff --git a/include/mapnik/symbolizer_helpers.hpp b/include/mapnik/symbolizer_helpers.hpp index c6bc585c2..479b02db9 100644 --- a/include/mapnik/symbolizer_helpers.hpp +++ b/include/mapnik/symbolizer_helpers.hpp @@ -30,7 +30,7 @@ #include //boost -#include +#include // agg #include "agg_trans_affine.h" @@ -57,7 +57,7 @@ class text_symbolizer_helper { public: text_symbolizer_helper(text_symbolizer const& sym, - Feature const& feature, + feature_impl const& feature, proj_transform const& prj_trans, unsigned width, unsigned height, @@ -65,34 +65,14 @@ public: CoordTransform const& t, FaceManagerT &font_manager, DetectorT &detector, - box2d const& query_extent) - : sym_(sym), - feature_(feature), - prj_trans_(prj_trans), - t_(t), - font_manager_(font_manager), - detector_(detector), - dims_(0, 0, width, height), - query_extent_(query_extent), - text_(font_manager, scale_factor), - angle_(0.0), - placement_valid_(false), - points_on_line_(false), - finder_() - { - initialize_geometries(); - if (!geometries_to_process_.size()) return; - placement_ = sym_.get_placement_options()->get_placement_info(scale_factor); - next_placement(); - initialize_points(); - } + box2d const& query_extent); - /** Return next placement. - * If no more placements are found returns null pointer. - */ + ~text_symbolizer_helper(); + // Return next placement. + // If no more placements are found returns null pointer. bool next(); - /** Get current placement. next() has to be called before! */ + // Get current placement. next() has to be called before! placements_type const& placements() const; protected: bool next_point_placement(); @@ -104,7 +84,7 @@ protected: //Input text_symbolizer const& sym_; - Feature const& feature_; + feature_impl const& feature_; proj_transform const& prj_trans_; CoordTransform const& t_; FaceManagerT & font_manager_; @@ -113,28 +93,26 @@ protected: box2d const& query_extent_; //Processing processed_text text_; - /* Using list instead of vector, because we delete random elements and need iterators to stay valid. */ - /** Remaining geometries to be processed. */ + // Using list instead of vector, because we delete random elements and need iterators to stay valid. + // Remaining geometries to be processed. std::list geometries_to_process_; - /** Geometry currently being processed. */ + // Geometry currently being processed. std::list::iterator geo_itr_; - /** Remaining points to be processed. */ + // Remaining points to be processed. std::list points_; - /** Point currently being processed. */ + // Point currently being processed. std::list::iterator point_itr_; - /** Text rotation. */ + // Text rotation. double angle_; - /** Text + formatting. */ - string_info *info_; - /** Did last call to next_placement return true? */ + // Did last call to next_placement return true? bool placement_valid_; - /** Use point placement. Otherwise line placement is used. */ + // Use point placement. Otherwise line placement is used. bool point_placement_; - /** Place text at points on a line instead of following the line (used for ShieldSymbolizer) .*/ + // Place text at points on a line instead of following the line (used for ShieldSymbolizer). bool points_on_line_; text_placement_info_ptr placement_; - boost::shared_ptr > finder_; + boost::scoped_ptr > finder_; }; template @@ -142,7 +120,7 @@ class shield_symbolizer_helper: public text_symbolizer_helper::geometries_to_process_; using text_symbolizer_helper::placement_; using text_symbolizer_helper::next_placement; - using text_symbolizer_helper::info_; using text_symbolizer_helper::geo_itr_; using text_symbolizer_helper::point_itr_; using text_symbolizer_helper::points_; diff --git a/include/mapnik/text_path.hpp b/include/mapnik/text_path.hpp index b45ae9a6c..b08c1e567 100644 --- a/include/mapnik/text_path.hpp +++ b/include/mapnik/text_path.hpp @@ -99,7 +99,7 @@ public: return at(i); } - UnicodeString const& get_string() const + UnicodeString const& get_string() const { return text_; } @@ -110,10 +110,10 @@ public: return (text_.indexOf(break_char) >= 0); } - /** Resets object to initial state. */ - void clear(void) + // Resets object to initial state. + void clear() { - text_ = ""; + text_.remove(); characters_.clear(); } }; @@ -121,7 +121,7 @@ public: typedef char_info const * char_info_ptr; -/** List of all characters and their positions and formats for a placement. */ +// List of all characters and their positions and formats for a placement. class text_path : mapnik::noncopyable { struct character_node @@ -140,12 +140,12 @@ class text_path : mapnik::noncopyable ~character_node() {} - void vertex(char_info_ptr *c_, double *x_, double *y_, double *angle_) const + void vertex(char_info_ptr & c_, double & x_, double & y_, double & angle_) const { - *c_ = c; - *x_ = pos.x; - *y_ = pos.y; - *angle_ = angle; + c_ = c; + x_ = pos.x; + y_ = pos.y; + angle_ = angle; } }; @@ -172,7 +172,7 @@ public: } /** Return node. Always returns a new node. Has no way to report that there are no more nodes. */ - void vertex(char_info_ptr *c, double *x, double *y, double *angle) const + void vertex(char_info_ptr & c, double & x, double & y, double & angle) const { nodes_[itr_++].vertex(c, x, y, angle); } diff --git a/include/mapnik/text_placements/base.hpp b/include/mapnik/text_placements/base.hpp index 5fbc5c8fe..99a7f1cd1 100644 --- a/include/mapnik/text_placements/base.hpp +++ b/include/mapnik/text_placements/base.hpp @@ -37,7 +37,7 @@ class MAPNIK_DECL text_placements; * This placement has first to be tested by placement_finder to verify it * can actually be used. */ -class text_placement_info : mapnik::noncopyable +class MAPNIK_DECL text_placement_info : mapnik::noncopyable { public: /** Constructor. Takes the parent text_placements object as a parameter @@ -77,7 +77,7 @@ typedef boost::shared_ptr text_placement_info_ptr; * semantics. Basically this class just makes sure a pointer of the right * class is returned by the get_placement_info call. */ -class text_placements +class MAPNIK_DECL text_placements { public: text_placements(); diff --git a/include/mapnik/text_properties.hpp b/include/mapnik/text_properties.hpp index c21f0654e..bbd7a6e85 100644 --- a/include/mapnik/text_properties.hpp +++ b/include/mapnik/text_properties.hpp @@ -54,7 +54,7 @@ DEFINE_ENUM(text_transform_e, text_transform); typedef std::map fontset_map; -struct char_properties +struct MAPNIK_DECL char_properties { char_properties(); /** Construct object from XML. */ @@ -125,7 +125,7 @@ class processed_text; /** Contains all text symbolizer properties which are not directly related to text formatting. */ -struct text_symbolizer_properties +struct MAPNIK_DECL text_symbolizer_properties { text_symbolizer_properties(); /** Load all values from XML ptree. */ diff --git a/include/mapnik/text_symbolizer.hpp b/include/mapnik/text_symbolizer.hpp index 3e8fb06f1..3a8945ded 100644 --- a/include/mapnik/text_symbolizer.hpp +++ b/include/mapnik/text_symbolizer.hpp @@ -46,6 +46,15 @@ namespace mapnik { +enum halo_rasterizer_enum +{ + HALO_RASTERIZER_FULL, + HALO_RASTERIZER_FAST, + halo_rasterizer_enum_MAX +}; + +DEFINE_ENUM(halo_rasterizer_e, halo_rasterizer_enum); + struct MAPNIK_DECL text_symbolizer : public symbolizer_base { // Note - we do not use boost::make_shared below as VC2008 and VC2010 are @@ -100,6 +109,8 @@ struct MAPNIK_DECL text_symbolizer : public symbolizer_base color const& get_halo_fill() const func_deprecated; void set_halo_radius(double radius); double get_halo_radius() const func_deprecated; + void set_halo_rasterizer(halo_rasterizer_e rasterizer_p); + halo_rasterizer_e get_halo_rasterizer() const; void set_label_placement(label_placement_e label_p); label_placement_e get_label_placement() const func_deprecated; void set_vertical_alignment(vertical_alignment_e valign); @@ -131,6 +142,7 @@ struct MAPNIK_DECL text_symbolizer : public symbolizer_base bool largest_bbox_only() const; private: text_placements_ptr placement_options_; + halo_rasterizer_e halo_rasterizer_; }; } diff --git a/include/mapnik/tiff_io.hpp b/include/mapnik/tiff_io.hpp index 8d6dc8833..d3c52a5c4 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) 2011 Artem Pavlenko + * 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 @@ -24,8 +24,7 @@ #define MAPNIK_TIFF_IO_HPP #include - -#include +#include extern "C" { @@ -45,37 +44,89 @@ namespace mapnik { static tsize_t tiff_write_proc(thandle_t fd, tdata_t buf, tsize_t size) { - std::ostream* out = (std::ostream*)fd; + std::ostream* out = reinterpret_cast(fd); + std::ios::pos_type pos = out->tellp(); + std::streamsize request_size = size; + if (static_cast(request_size) != size) + return static_cast(-1); + out->write(reinterpret_cast(buf), size); - out->write((const char*)buf, size); - - return size; + if( static_cast(pos) == -1 ) + { + return size; + } + else + { + return static_cast(out->tellp()-pos); + } } static toff_t tiff_seek_proc(thandle_t fd, toff_t off, int whence) { - if (off == 0xFFFFFFFF) - { - return 0xFFFFFFFF; - } + std::ostream* out = reinterpret_cast(fd); - std::ostream* out = (std::ostream*)fd; + if( out->fail() ) + return static_cast(-1); + + if( static_cast(out->tellp()) == -1) + return static_cast< toff_t >( 0 ); switch(whence) { + case SEEK_SET: + out->seekp(off, std::ios_base::beg); + break; case SEEK_CUR: out->seekp(off, std::ios_base::cur); break; case SEEK_END: out->seekp(off, std::ios_base::end); break; - case SEEK_SET: - default: - out->seekp(off, std::ios_base::beg); - break; } + // grow std::stringstream buffer (re: libtiff/tif_stream.cxx) + std::ios::pos_type pos = out->tellp(); + // second check needed for clang (libcxx doesn't set failbit when seeking beyond the current buffer size + if( out->fail() || static_cast(off) != pos) + { + std::ios::iostate old_state; + std::ios::pos_type origin; + old_state = out->rdstate(); + // reset the fail bit or else tellp() won't work below + out->clear(out->rdstate() & ~std::ios::failbit); + switch( whence ) + { + case SEEK_SET: + default: + origin = 0L; + break; + case SEEK_CUR: + origin = out->tellp(); + break; + case SEEK_END: + out->seekp(0, std::ios::end); + origin = out->tellp(); + break; + } + // restore original stream state + out->clear(old_state); - return (toff_t)out->tellp(); + // only do something if desired seek position is valid + if( (static_cast(origin) + off) > 0L) + { + uint64_t num_fill; + // clear the fail bit + out->clear(out->rdstate() & ~std::ios::failbit); + // extend the stream to the expected size + out->seekp(0, std::ios::end); + num_fill = (static_cast(origin)) + off - out->tellp(); + for( uint64_t i = 0; i < num_fill; ++i) + out->put('\0'); + + // retry the seek + out->seekp(static_cast(static_cast(origin) + off), std::ios::beg); + } + } + return static_cast(out->tellp()); } static int tiff_close_proc(thandle_t fd) @@ -87,20 +138,24 @@ static int tiff_close_proc(thandle_t fd) static toff_t tiff_size_proc(thandle_t fd) { - std::ostream* out = (std::ostream*)fd; - return (toff_t)out->tellp(); + std::ostream* out = reinterpret_cast(fd); + std::ios::pos_type pos = out->tellp(); + out->seekp(0, std::ios::end); + std::ios::pos_type len = out->tellp(); + out->seekp(pos); + return (toff_t)len; } -static tsize_t tiff_dummy_read_proc(thandle_t fd, tdata_t buf, tsize_t size) +static tsize_t tiff_dummy_read_proc(thandle_t , tdata_t , tsize_t) { return 0; } -static void tiff_dummy_unmap_proc(thandle_t fd, tdata_t base, toff_t size) +static void tiff_dummy_unmap_proc(thandle_t , tdata_t , toff_t) { } -static int tiff_dummy_map_proc(thandle_t fd, tdata_t* pbase, toff_t* psize) +static int tiff_dummy_map_proc(thandle_t , tdata_t*, toff_t* ) { return 0; } @@ -113,7 +168,7 @@ void save_as_tiff(T1 & file, T2 const& image) const int scanline_size = sizeof(unsigned char) * width * 3; TIFF* output = RealTIFFOpen("mapnik_tiff_stream", - "w", + "wm", (thandle_t)&file, tiff_dummy_read_proc, tiff_write_proc, @@ -124,7 +179,7 @@ void save_as_tiff(T1 & file, T2 const& image) tiff_dummy_unmap_proc); if (! output) { - // throw ? + throw ImageWriterException("Could not write TIFF"); } TIFFSetField(output, TIFFTAG_IMAGEWIDTH, width); @@ -138,17 +193,16 @@ void save_as_tiff(T1 & file, T2 const& image) // TODO - handle palette images // std::vector const& palette - /* - unsigned short r[256], g[256], b[256]; - for (int i = 0; i < (1 << 24); ++i) - { - r[i] = (unsigned short)palette[i * 3 + 0] << 8; - g[i] = (unsigned short)palette[i * 3 + 1] << 8; - b[i] = (unsigned short)palette[i * 3 + 2] << 8; - } - TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); - TIFFSetField(output, TIFFTAG_COLORMAP, r, g, b); - */ + + // unsigned short r[256], g[256], b[256]; + // for (int i = 0; i < (1 << 24); ++i) + // { + // r[i] = (unsigned short)palette[i * 3 + 0] << 8; + // g[i] = (unsigned short)palette[i * 3 + 1] << 8; + // b[i] = (unsigned short)palette[i * 3 + 2] << 8; + // } + // TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); + // TIFFSetField(output, TIFFTAG_COLORMAP, r, g, b); #ifdef HAVE_GEOTIFF GTIF* geotiff = GTIFNew(output); diff --git a/include/mapnik/unicode.hpp b/include/mapnik/unicode.hpp index ae2139a5e..fd4e8e40a 100644 --- a/include/mapnik/unicode.hpp +++ b/include/mapnik/unicode.hpp @@ -51,4 +51,10 @@ private: }; } +namespace U_ICU_NAMESPACE { +inline std::size_t hash_value(const UnicodeString& val) { + return val.hashCode(); +} +} + #endif // MAPNIK_UNICODE_HPP diff --git a/include/mapnik/util/container_adapter.hpp b/include/mapnik/util/container_adapter.hpp index 5f98e995e..d6c1bbc26 100644 --- a/include/mapnik/util/container_adapter.hpp +++ b/include/mapnik/util/container_adapter.hpp @@ -55,7 +55,7 @@ template <> struct end_container { static mapnik::util::path_iterator - call (mapnik::geometry_type const& g) + call (mapnik::geometry_type const& /*g*/) { return mapnik::util::path_iterator(); } diff --git a/include/mapnik/util/conversions.hpp b/include/mapnik/util/conversions.hpp index 522633d4a..9c7c0a514 100644 --- a/include/mapnik/util/conversions.hpp +++ b/include/mapnik/util/conversions.hpp @@ -32,22 +32,28 @@ namespace mapnik { namespace util { -MAPNIK_DECL bool string2bool(const char * value, bool & result); -MAPNIK_DECL bool string2bool(std::string const& value, bool & result); +/* +Note: this file intentionally provides non-templated methods +to avoid the compile time overhead given it is included +by many other headers inside mapnik. +*/ + +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(const char * value, int & result); MAPNIK_DECL bool string2int(std::string const& value, int & result); +MAPNIK_DECL bool string2int(const char * iter, const char * end, int & result); #ifdef BIGINT -MAPNIK_DECL bool string2int(const char * value, mapnik::value_integer & result); MAPNIK_DECL bool string2int(std::string const& value, mapnik::value_integer & result); +MAPNIK_DECL bool string2int(const char * iter, const char * end, mapnik::value_integer & result); #endif MAPNIK_DECL bool string2double(std::string const& value, double & result); -MAPNIK_DECL bool string2double(const char * value, double & result); +MAPNIK_DECL bool string2double(const char * iter, const char * end, double & result); MAPNIK_DECL bool string2float(std::string const& value, float & result); -MAPNIK_DECL bool string2float(const char * value, float & result); +MAPNIK_DECL bool string2float(const char * iter, const char * end, float & result); MAPNIK_DECL bool to_string(std::string & str, int value); #ifdef BIGINT diff --git a/plugins/input/kismet/kismet_featureset.hpp b/include/mapnik/util/featureset_buffer.hpp similarity index 52% rename from plugins/input/kismet/kismet_featureset.hpp rename to include/mapnik/util/featureset_buffer.hpp index 91e6afef7..42a07e8ee 100644 --- a/plugins/input/kismet/kismet_featureset.hpp +++ b/include/mapnik/util/featureset_buffer.hpp @@ -2,7 +2,7 @@ * * This file is part of Mapnik (c++ mapping toolkit) * - * Copyright (C) 2011 Artem Pavlenko + * 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 @@ -20,42 +20,58 @@ * *****************************************************************************/ -#ifndef KISMET_FEATURESET_HPP -#define KISMET_FEATURESET_HPP +#ifndef MAPNIK_FEATURESET_BUFFER_HPP +#define MAPNIK_FEATURESET_BUFFER_HPP // mapnik -#include #include -#include -#include -#include -#include -// boost -#include -#include +#include -//STL -#include +namespace mapnik { -#include "kismet_types.hpp" - -class kismet_featureset : public mapnik::Featureset +class featureset_buffer : public Featureset { public: - kismet_featureset(std::list const& knd_list, - std::string const& srs, - std::string const& encoding); - virtual ~kismet_featureset(); - mapnik::feature_ptr next(); + featureset_buffer() + : features_(), + pos_(), + end_() + {} + + virtual ~featureset_buffer() {} + + feature_ptr next() + { + if (pos_ != end_) + { + return *pos_++; + } + return feature_ptr(); + } + + void push(feature_ptr const& feature) + { + features_.push_back(feature); + } + + void prepare() + { + pos_ = features_.begin(); + end_ = features_.end(); + } + + void clear() + { + features_.clear(); + } private: - std::list const& knd_list_; - boost::scoped_ptr tr_; - mapnik::value_integer feature_id_; - std::list::const_iterator knd_list_it; - mapnik::projection source_; - mapnik::context_ptr ctx_; + std::vector features_; + std::vector::iterator pos_; + std::vector::iterator end_; }; -#endif // KISMET_FEATURESET_HPP +} + +#endif // MAPNIK_FEATURESET_BUFFER_HPP diff --git a/include/mapnik/util/fs.hpp b/include/mapnik/util/fs.hpp new file mode 100644 index 000000000..69170596e --- /dev/null +++ b/include/mapnik/util/fs.hpp @@ -0,0 +1,46 @@ +/***************************************************************************** + * + * 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_FS_HPP +#define MAPNIK_FS_HPP + +// mapnik +#include + +// stl +#include + +namespace mapnik { namespace util { + +MAPNIK_DECL bool exists(std::string const& value); +MAPNIK_DECL bool is_directory(std::string const& value); +MAPNIK_DECL bool remove(std::string const& value); +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); + +}} + + + +#endif \ No newline at end of file diff --git a/include/mapnik/util/geometry_svg_generator.hpp b/include/mapnik/util/geometry_svg_generator.hpp index 070521031..107ad8eb1 100644 --- a/include/mapnik/util/geometry_svg_generator.hpp +++ b/include/mapnik/util/geometry_svg_generator.hpp @@ -76,7 +76,7 @@ template <> struct end_container { static mapnik::util::path_iterator - call (path_type const& g) + call (path_type const& /*g*/) { return mapnik::util::path_iterator(); } @@ -126,7 +126,7 @@ namespace mapnik { namespace util { { typedef boost::spirit::karma::real_policies base_type; static int floatfield(T n) { return base_type::fmtflags::fixed; } - static unsigned precision(T n) { return 6u ;} + static unsigned precision(T n) { return 4u ;} }; } @@ -161,14 +161,14 @@ namespace mapnik { namespace util { ; linestring = &uint_(mapnik::LineString)[_1 = _type(_val)] - << svg_path << lit('\"') + << lit("d=\"") << svg_path << lit("\"") ; polygon = &uint_(mapnik::Polygon)[_1 = _type(_val)] - << svg_path << lit('\"') + << lit("d=\"") << svg_path << lit("\"") ; - svg_path %= ((&uint_(mapnik::SEG_MOVETO) << lit("d=\"") << lit('M') + svg_path %= ((&uint_(mapnik::SEG_MOVETO) << lit('M') | &uint_(mapnik::SEG_LINETO) [_a +=1] << karma::string [if_(_a == 1) [_1 = "L" ] ]) << lit(' ') << coordinate << lit(' ') << coordinate) % lit(' ') ; diff --git a/include/mapnik/util/geometry_to_ds_type.hpp b/include/mapnik/util/geometry_to_ds_type.hpp index d0db1e284..cff44bc27 100644 --- a/include/mapnik/util/geometry_to_ds_type.hpp +++ b/include/mapnik/util/geometry_to_ds_type.hpp @@ -33,7 +33,7 @@ namespace mapnik { namespace util { - void to_ds_type(mapnik::geometry_container const& paths, + static inline void to_ds_type(mapnik::geometry_container const& paths, boost::optional & result) { if (paths.size() == 1) diff --git a/include/mapnik/util/geometry_to_wkb.hpp b/include/mapnik/util/geometry_to_wkb.hpp index 4c3bb589f..ef7f0784c 100644 --- a/include/mapnik/util/geometry_to_wkb.hpp +++ b/include/mapnik/util/geometry_to_wkb.hpp @@ -172,8 +172,6 @@ wkb_buffer_ptr to_polygon_wkb( GeometryType const& g, wkbByteOrder byte_order) double x = 0; double y = 0; - double start_x = 0; - double start_y = 0; std::size_t size = 1 + 4 + 4 ; // byteOrder + wkbType + numRings for (unsigned i=0; i< num_points; ++i) { @@ -181,17 +179,15 @@ wkb_buffer_ptr to_polygon_wkb( GeometryType const& g, wkbByteOrder byte_order) if (command == SEG_MOVETO) { rings.push_back(new linear_ring); // start new loop - start_x = x; - start_y = y; + rings.back().push_back(std::make_pair(x,y)); size += 4; // num_points + size += 2 * 8; // point } - else if (command == SEG_CLOSE) + else if (command == SEG_LINETO) { - x = start_x; - y = start_y; + rings.back().push_back(std::make_pair(x,y)); + size += 2 * 8; // point } - rings.back().push_back(std::make_pair(x,y)); - size += 2 * 8; // point } unsigned num_rings = rings.size(); wkb_buffer_ptr wkb = boost::make_shared(size); diff --git a/include/mapnik/util/geometry_to_wkt.hpp b/include/mapnik/util/geometry_to_wkt.hpp index e49423ece..5f6ca4bc6 100644 --- a/include/mapnik/util/geometry_to_wkt.hpp +++ b/include/mapnik/util/geometry_to_wkt.hpp @@ -24,34 +24,14 @@ #define MAPNIK_GEOMETRY_TO_WKT_HPP // mapnik -#include +#include #include -#include - -// boost -#include namespace mapnik { namespace util { -namespace karma = boost::spirit::karma; +MAPNIK_DECL bool to_wkt(std::string & wkt, mapnik::geometry_type const& geom); -bool to_wkt(std::string & wkt, mapnik::geometry_type const& geom) -{ - typedef std::back_insert_iterator sink_type; - sink_type sink(wkt); - wkt_generator generator(true); - bool result = karma::generate(sink, generator, geom); - return result; -} - -bool to_wkt(std::string & wkt, mapnik::geometry_container const& geom) -{ - typedef std::back_insert_iterator sink_type; - sink_type sink(wkt); - wkt_multi_generator generator; - bool result = karma::generate(sink, generator, geom); - return result; -} +MAPNIK_DECL bool to_wkt(std::string & wkt, mapnik::geometry_container const& geom); }} diff --git a/include/mapnik/util/hsl.hpp b/include/mapnik/util/hsl.hpp new file mode 100644 index 000000000..ff3fa3466 --- /dev/null +++ b/include/mapnik/util/hsl.hpp @@ -0,0 +1,72 @@ +/***************************************************************************** + * + * 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_HSL_HPP +#define MAPNIK_HSL_HPP + +#include + +namespace mapnik { + +static inline void rgb2hsl(unsigned char red, unsigned char green, unsigned char blue, + double & h, double & s, double & l) { + double r = red/255.0; + double g = green/255.0; + double b = blue/255.0; + double max = std::max(r,std::max(g,b)); + double min = std::min(r,std::min(g,b)); + double delta = max - min; + double gamma = max + min; + h = 0.0, s = 0.0, l = gamma / 2.0; + if (delta > 0.0) { + s = l > 0.5 ? delta / (2.0 - gamma) : delta / gamma; + if (max == r && max != g) h = (g - b) / delta + (g < b ? 6.0 : 0.0); + else if (max == g && max != b) h = (b - r) / delta + 2.0; + else if (max == b && max != r) h = (r - g) / delta + 4.0; + h /= 6.0; + } +} + +static inline double hueToRGB(double m1, double m2, double h) { + if(h < 0) h += 1; + if(h > 1) h -= 1; + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6; + return m1; +} + +static inline void hsl2rgb(double h, double s, double l, + unsigned char & r, unsigned char & g, unsigned char & b) { + if (!s) { + r = g = b = static_cast(std::floor((l * 255.0)+.5)); + } + double m2 = (l <= 0.5) ? l * (s + 1) : l + s - l * s; + double m1 = l * 2 - m2; + r = static_cast(std::floor((hueToRGB(m1, m2, h + 0.33333) * 255.0)+.5)); + g = static_cast(std::floor((hueToRGB(m1, m2, h) * 255.0)+.5)); + b = static_cast(std::floor((hueToRGB(m1, m2, h - 0.33333) * 255.0)+.5)); +} + +} + +#endif // end MAPNIK_HSL_HPP \ No newline at end of file diff --git a/include/mapnik/utils.hpp b/include/mapnik/utils.hpp index 24a5d3d54..a9f013f5b 100644 --- a/include/mapnik/utils.hpp +++ b/include/mapnik/utils.hpp @@ -23,6 +23,8 @@ #ifndef MAPNIK_UTILS_HPP #define MAPNIK_UTILS_HPP +#include + // boost #ifdef MAPNIK_THREADSAFE #include @@ -38,6 +40,7 @@ namespace mapnik { + #ifdef MAPNIK_THREADSAFE using boost::mutex; #endif @@ -82,86 +85,103 @@ public: return new(&staticMemory) T; } #ifdef __SUNPRO_CC - // Sun C++ Compiler doesn't handle `volatile` keyword same as GCC. +// Sun C++ Compiler doesn't handle `volatile` keyword same as GCC. static void destroy(T* obj) #else - static void destroy(volatile T* obj) + static void destroy(volatile T* obj) #endif { obj->~T(); } }; +#ifdef __GNUC__ template class CreatePolicy=CreateStatic> class singleton + template class CreatePolicy=CreateStatic> class MAPNIK_DECL singleton { -#ifdef __SUNPRO_CC - /* Sun's C++ compiler will issue the following errors if CreatePolicy is used: - Error: A class template name was expected instead of mapnik::CreatePolicy - Error: A "friend" declaration must specify a class or function. - */ - friend class CreatePolicy; #else - friend class CreatePolicy; + template class CreatePolicy=CreateStatic> class singleton + { #endif - static T* pInstance_; - static bool destroyed_; - singleton(const singleton &rhs); - singleton& operator=(const singleton&); - static void onDeadReference() - { - throw std::runtime_error("dead reference!"); - } - - static void DestroySingleton() - { - CreatePolicy::destroy(pInstance_); - pInstance_ = 0; - destroyed_ = true; - } - -protected: -#ifdef MAPNIK_THREADSAFE - static mutex mutex_; +#ifdef __SUNPRO_CC +/* Sun's C++ compiler will issue the following errors if CreatePolicy is used: + Error: A class template name was expected instead of mapnik::CreatePolicy + Error: A "friend" declaration must specify a class or function. +*/ + friend class CreatePolicy; +#else + friend class CreatePolicy; #endif - singleton() {} -public: - static T& instance() - { - if (! pInstance_) + static T* pInstance_; + static bool destroyed_; + singleton(const singleton &rhs); + singleton& operator=(const singleton&); + + static void onDeadReference() { + throw std::runtime_error("dead reference!"); + } + + static void DestroySingleton() + { + CreatePolicy::destroy(pInstance_); + pInstance_ = 0; + destroyed_ = true; + } + + protected: #ifdef MAPNIK_THREADSAFE - mutex::scoped_lock lock(mutex_); + static mutex mutex_; #endif + singleton() {} + public: + static T& instance() + { if (! pInstance_) { - if (destroyed_) +#ifdef MAPNIK_THREADSAFE + mutex::scoped_lock lock(mutex_); +#endif + if (! pInstance_) { - destroyed_ = false; - onDeadReference(); - } - else - { - pInstance_ = CreatePolicy::create(); + if (destroyed_) + { + destroyed_ = false; + onDeadReference(); + } + else + { + pInstance_ = CreatePolicy::create(); - // register destruction - std::atexit(&DestroySingleton); + // register destruction + std::atexit(&DestroySingleton); + } } } + return *pInstance_; } - return *pInstance_; - } -}; + }; #ifdef MAPNIK_THREADSAFE -template class CreatePolicy> mutex singleton::mutex_; + template class CreatePolicy> mutex singleton::mutex_; #endif -template class CreatePolicy> T* singleton::pInstance_=0; -template class CreatePolicy> bool singleton::destroyed_=false; + template class CreatePolicy> T* singleton::pInstance_=0; + template class CreatePolicy> bool singleton::destroyed_=false; + + +#ifdef _WINDOWS + +// UTF8 <--> UTF16 conversion routines + +MAPNIK_DECL std::string utf16_to_utf8(std::wstring const& wstr); +MAPNIK_DECL std::wstring utf8_to_utf16(std::string const& str); + +#endif // _WINDOWS } diff --git a/include/mapnik/value.hpp b/include/mapnik/value.hpp index 41f51a087..9ca954a6f 100644 --- a/include/mapnik/value.hpp +++ b/include/mapnik/value.hpp @@ -36,13 +36,12 @@ #include #include #include +#include +#include "hash_variant.hpp" // stl -#include -#include #include #include - // uci #include #include @@ -80,26 +79,34 @@ namespace impl { struct equals : public boost::static_visitor { - template - bool operator() (const T &, const U &) const - { - return false; - } - - template - bool operator() (T lhs, T rhs) const - { - return lhs == rhs; - } - bool operator() (value_integer lhs, value_double rhs) const { return lhs == rhs; } + bool operator() (value_bool lhs, value_double rhs) const + { + return lhs == rhs; + } + bool operator() (value_double lhs, value_integer rhs) const { - return (lhs == rhs)? true : false ; + return lhs == rhs; + } + + bool operator() (value_bool lhs, value_integer rhs) const + { + return lhs == rhs; + } + + bool operator() (value_integer lhs, value_bool rhs) const + { + return lhs == rhs; + } + + bool operator() (value_double lhs, value_bool rhs) const + { + return lhs == rhs; } bool operator() (value_unicode_string const& lhs, @@ -108,10 +115,16 @@ struct equals return (lhs == rhs) ? true: false; } - bool operator() (value_null, value_null) const + template + bool operator() (T lhs, T rhs) const { - // this changed from false to true - https://github.com/mapnik/mapnik/issues/794 - return true; + return lhs == rhs; + } + + template + bool operator() (T const& /*lhs*/, U const& /*rhs*/) const + { + return false; } }; @@ -135,35 +148,46 @@ struct not_equals return lhs != rhs; } + bool operator() (value_bool lhs, value_double rhs) const + { + return lhs != rhs; + } + bool operator() (value_double lhs, value_integer rhs) const { return lhs != rhs; } + bool operator() (value_bool lhs, value_integer rhs) const + { + return lhs != rhs; + } + + bool operator() (value_integer lhs, value_bool rhs) const + { + return lhs != rhs; + } + + bool operator() (value_double lhs, value_bool rhs) const + { + return lhs != rhs; + } + bool operator() (value_unicode_string const& lhs, value_unicode_string const& rhs) const { return (lhs != rhs)? true : false; } - bool operator() (value_null, value_null) const + // back compatibility shim to equate empty string with null for != test + // https://github.com/mapnik/mapnik/issues/1859 + // TODO - consider removing entire specialization at Mapnik 3.x + bool operator() (value_null /*lhs*/, value_unicode_string const& rhs) const { - return false; - } - - template - bool operator() (value_null, const T &) const - { - // https://github.com/mapnik/mapnik/issues/1642 + if (rhs.isEmpty()) return false; return true; } - template - bool operator() (const T &, value_null) const - { - // https://github.com/mapnik/mapnik/issues/1642 - return true; - } }; struct greater_than @@ -529,12 +553,12 @@ struct mod: public boost::static_visitor value_type operator() (value_double lhs, value_integer rhs) const { - return std::fmod(lhs, rhs); + return std::fmod(lhs, static_cast(rhs)); } value_type operator() (value_integer lhs, value_double rhs) const { - return std::fmod(lhs, rhs); + return std::fmod(static_cast(lhs), rhs); } value_type operator() (value_double lhs, value_double rhs) const @@ -668,6 +692,13 @@ struct to_expression_string : public boost::static_visitor return "'" + utf8 + "'"; } + std::string operator() (value_integer val) const + { + std::string output; + util::to_string(output,val); + return output; + } + std::string operator() (value_double val) const { std::string output; @@ -685,14 +716,6 @@ struct to_expression_string : public boost::static_visitor boost::ignore_unused_variable_warning(val); return "null"; } - - template - std::string operator() (T val) const - { - std::stringstream ss; - ss << val; - return ss.str(); - } }; struct to_double : public boost::static_visitor @@ -905,6 +928,10 @@ operator << (std::basic_ostream& out, return out; } +inline std::size_t hash_value(const value& val) { + return hash_value(val.base()); +} + } // namespace value_adl_barrier using value_adl_barrier::value; diff --git a/include/mapnik/value_error.hpp b/include/mapnik/value_error.hpp index 08786cf18..aca3c3239 100644 --- a/include/mapnik/value_error.hpp +++ b/include/mapnik/value_error.hpp @@ -23,6 +23,8 @@ #ifndef MAPNIK_VALUE_ERROR_HPP #define MAPNIK_VALUE_ERROR_HPP +#include + #include #include diff --git a/include/mapnik/value_types.hpp b/include/mapnik/value_types.hpp index 7a73a8721..c188d40b9 100644 --- a/include/mapnik/value_types.hpp +++ b/include/mapnik/value_types.hpp @@ -47,6 +47,16 @@ typedef bool value_bool; struct value_null { + bool operator==(value_null const& /*other*/) const + { + return true; + } + + bool operator!=(value_null const& /*other*/) const + { + return false; + } + template value_null operator+ (T const& /*other*/) const { @@ -78,7 +88,11 @@ struct value_null } }; -inline std::ostream& operator<< (std::ostream & out,value_null const& v) +inline std::size_t hash_value(const value_null& /*val*/) { + return 0; +} + +inline std::ostream& operator<< (std::ostream & out,value_null const& /*v*/) { return out; } diff --git a/include/mapnik/version.hpp b/include/mapnik/version.hpp index 35fd1b2a6..cfb3bd0e3 100644 --- a/include/mapnik/version.hpp +++ b/include/mapnik/version.hpp @@ -25,11 +25,11 @@ #define MAPNIK_VERSION_IS_RELEASE 0 -#define MAPNIK_MAJOR_VERSION 2 -#define MAPNIK_MINOR_VERSION 2 +#define MAPNIK_MAJOR_VERSION 3 +#define MAPNIK_MINOR_VERSION 0 #define MAPNIK_PATCH_VERSION 0 -// translates to 200200 +// translates to 300000 #define MAPNIK_VERSION (MAPNIK_MAJOR_VERSION*100000) + (MAPNIK_MINOR_VERSION*100) + (MAPNIK_PATCH_VERSION) #ifndef MAPNIK_STRINGIFY diff --git a/include/mapnik/vertex_converters.hpp b/include/mapnik/vertex_converters.hpp index b669f58ce..9cb0d6e49 100644 --- a/include/mapnik/vertex_converters.hpp +++ b/include/mapnik/vertex_converters.hpp @@ -39,6 +39,7 @@ #include // fusion +#include #include #include #include @@ -63,6 +64,9 @@ #include "agg_conv_clipper.h" #include "agg_path_storage.h" +// stl +#include + namespace mapnik { struct transform_tag {}; @@ -85,9 +89,9 @@ struct converter_traits typedef T0 geometry_type; typedef geometry_type conv_type; template - static void setup(geometry_type & geom, Args const& args) + static void setup(geometry_type & /*geom*/, Args const& /*args*/) { - throw "BOOM!"; + throw std::runtime_error("invalid call to setup"); } }; @@ -215,7 +219,7 @@ struct converter_traits typedef T geometry_type; typedef typename agg::conv_close_polygon conv_type; template - static void setup(geometry_type & geom, Args const& args) + static void setup(geometry_type & /*geom*/, Args const& /*args*/) { // no-op } @@ -266,7 +270,8 @@ struct converter_traits static void setup(geometry_type & geom, Args const& args) { typename boost::mpl::at >::type sym = boost::fusion::at_c<2>(args); - geom.set_offset(sym.offset()); + double scale_factor = boost::fusion::at_c<6>(args); + geom.set_offset(sym.offset()*scale_factor); } }; @@ -289,7 +294,7 @@ template <> struct converter_fwd { template - static void forward(Base& base, T0 & geom,T1 const& args) + static void forward(Base& base, T0 & geom,T1 const& /*args*/) { base.template dispatch(geom, typename boost::is_same::type()); } diff --git a/include/mapnik/webp_io.hpp b/include/mapnik/webp_io.hpp new file mode 100644 index 000000000..80c5473a3 --- /dev/null +++ b/include/mapnik/webp_io.hpp @@ -0,0 +1,130 @@ +/***************************************************************************** + * + * 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_WEBP_IO_HPP +#define MAPNIK_WEBP_IO_HPP + +#include + +#include +#include +#include + + +namespace mapnik { + +template +int webp_stream_write(const uint8_t* data, size_t data_size, const WebPPicture* picture) +{ + T* out = static_cast(picture->custom_ptr); + out->write(reinterpret_cast(data), data_size); + return true; +} + +std::string webp_encoding_error(WebPEncodingError error) { + std::ostringstream os; + switch (error) { + case VP8_ENC_ERROR_OUT_OF_MEMORY: os << "memory error allocating objects"; break; + case VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY: os << "memory error while flushing bits"; break; + case VP8_ENC_ERROR_NULL_PARAMETER: os << "a pointer parameter is NULL"; break; + case VP8_ENC_ERROR_INVALID_CONFIGURATION: os << "configuration is invalid"; break; + case VP8_ENC_ERROR_BAD_DIMENSION: os << "picture has invalid width/height"; break; + case VP8_ENC_ERROR_PARTITION0_OVERFLOW: os << "partition is bigger than 512k"; break; + case VP8_ENC_ERROR_PARTITION_OVERFLOW: os << "partition is bigger than 16M"; break; + case VP8_ENC_ERROR_BAD_WRITE: os << "error while flushing bytes"; break; + case VP8_ENC_ERROR_FILE_TOO_BIG: os << "file is bigger than 4G"; break; + default: os << "unknown error (" << error << ")"; break; + } + os << " during encoding"; + return os.str(); +} + +template +void save_as_webp(T1& file, + float quality, + int method, + int lossless, + int image_hint, + T2 const& image) +{ + WebPConfig config; + if (!WebPConfigPreset(&config, WEBP_PRESET_DEFAULT, quality)) + { + throw std::runtime_error("version mismatch"); + } + + // Add additional tuning + if (method >= 0) config.method = method; + #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 2 + config.lossless = lossless; + config.image_hint = static_cast(image_hint); + #else + #ifdef _MSC_VER + #pragma NOTE(compiling against webp that does not support lossless flag) + #else + #warning "compiling against webp that does not support lossless flag" + #endif + #endif + + bool valid = WebPValidateConfig(&config); + if (!valid) { + throw std::runtime_error("Invalid configuration"); + } + + WebPPicture pic; + if (!WebPPictureInit(&pic)) + { + throw std::runtime_error("version mismatch"); + } + pic.width = image.width(); + pic.height = image.height(); + #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 2 + pic.use_argb = 1; + #endif + if (!WebPPictureAlloc(&pic)) + { + throw std::runtime_error("memory error"); + } + + int stride = sizeof(typename T2::pixel_type) * image.width(); + uint8_t const* bytes = reinterpret_cast(image.getBytes()); + int ok = WebPPictureImportRGBA(&pic, bytes, stride); + if (!ok) + { + throw std::runtime_error(webp_encoding_error(pic.error_code)); + } + + pic.writer = webp_stream_write; + pic.custom_ptr = &file; + + ok = WebPEncode(&config, &pic); + WebPPictureFree(&pic); + if (!ok) + { + throw std::runtime_error(webp_encoding_error(pic.error_code)); + } + + file.flush(); +} +} + +#endif // MAPNIK_WEBP_IO_HPP diff --git a/include/mapnik/wkt/wkt_grammar.hpp b/include/mapnik/wkt/wkt_grammar.hpp index 9ddb7d869..e7e986f59 100644 --- a/include/mapnik/wkt/wkt_grammar.hpp +++ b/include/mapnik/wkt/wkt_grammar.hpp @@ -71,7 +71,7 @@ namespace mapnik { namespace wkt { void operator() (T path) const { BOOST_ASSERT( path!=0 ); - path->set_close(); + path->close_path(); } }; diff --git a/include/mapnik/xml_attribute_cast.hpp b/include/mapnik/xml_attribute_cast.hpp index ac736f6ca..76562f0c2 100644 --- a/include/mapnik/xml_attribute_cast.hpp +++ b/include/mapnik/xml_attribute_cast.hpp @@ -30,18 +30,21 @@ #include #include #include + // boost #include #include + // stl #include +#include namespace mapnik { namespace detail { template struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& /*source*/) { std::string err_msg = (boost::format("No conversion from std::string to %s") % typeid(T).name()).str(); throw std::runtime_error(err_msg); @@ -52,7 +55,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { bool result; if (mapnik::util::string2bool(source, result)) @@ -65,7 +68,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { int result; if (mapnik::util::string2int(source, result)) @@ -79,7 +82,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { int result; if (mapnik::util::string2int(source, result)) @@ -95,7 +98,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { int result; if (mapnik::util::string2int(source, result)) @@ -108,7 +111,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { float result; if (mapnik::util::string2float(source, result)) @@ -121,7 +124,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { double result; if (mapnik::util::string2double(source, result)) @@ -134,7 +137,7 @@ struct do_xml_attribute_cast template struct do_xml_attribute_cast > { - static inline boost::optional > xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional > xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { typedef typename boost::optional > result_type; try @@ -165,7 +168,7 @@ struct do_xml_attribute_cast template <> struct do_xml_attribute_cast { - static inline boost::optional xml_attribute_cast_impl(xml_tree const& tree, std::string const& source) + static inline boost::optional xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source) { return boost::optional(source); } diff --git a/include/mapnik/xml_tree.hpp b/include/mapnik/xml_tree.hpp index 966e034b0..25bd00d24 100644 --- a/include/mapnik/xml_tree.hpp +++ b/include/mapnik/xml_tree.hpp @@ -33,9 +33,6 @@ #include #include -// boost -#include - //stl #include diff --git a/plugins/input/csv/build.py b/plugins/input/csv/build.py index ae41bf6d1..ad766e013 100644 --- a/plugins/input/csv/build.py +++ b/plugins/input/csv/build.py @@ -1,37 +1,72 @@ -#!/usr/bin/env python +# +# 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 ('plugin_base') Import ('env') -PLUGIN_NAME = 'csv' +can_build = True +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 < 47: + can_build = False -install_dest = env['MAPNIK_INPUT_PLUGINS_DEST'] -plugin_env = plugin_base.Clone() +if not can_build: + print 'WARNING: skipping building the optional geojson datasource plugin which requires boost >= 1.47' +else: + Import ('plugin_base') -plugin_sources = Split( - """ - %(PLUGIN_NAME)s_datasource.cpp - """ % locals() - ) + PLUGIN_NAME = 'csv' -libraries = [] -libraries.append('mapnik') -libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append(env['ICU_LIB_NAME']) - -TARGET = plugin_env.SharedLibrary( - '../%s' % PLUGIN_NAME, - SHLIBPREFIX='', - SHLIBSUFFIX='.input', - source=plugin_sources, - LIBS=libraries, - LINKFLAGS=env.get('CUSTOM_LDFLAGS') - ) + plugin_env = plugin_base.Clone() -# if the plugin links to libmapnik ensure it is built first -Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + plugin_sources = Split( + """ + %(PLUGIN_NAME)s_datasource.cpp + """ % locals() + ) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(install_dest, TARGET) - env.Alias('install', install_dest) + # Link Library to Dependencies + libraries = [] + libraries.append('boost_system%s' % env['BOOST_APPEND']) + libraries.append(env['ICU_LIB_NAME']) + + if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') + + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env.get('CUSTOM_LDFLAGS')) + + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/csv/csv_datasource.cpp b/plugins/input/csv/csv_datasource.cpp index c5dcce469..54556d41e 100644 --- a/plugins/input/csv/csv_datasource.cpp +++ b/plugins/input/csv/csv_datasource.cpp @@ -30,6 +30,7 @@ // mapnik #include +#include #include #include #include @@ -119,9 +120,15 @@ csv_datasource::csv_datasource(parameters const& params) } else { +#if defined (_WINDOWS) + std::ifstream in(mapnik::utf8_to_utf16(filename_),std::ios_base::in | std::ios_base::binary); +#else std::ifstream in(filename_.c_str(),std::ios_base::in | std::ios_base::binary); +#endif if (!in.is_open()) + { throw mapnik::datasource_exception("CSV Plugin: could not open: '" + filename_ + "'"); + } parse_csv(in,escape_, separator_, quote_); in.close(); } @@ -859,7 +866,7 @@ void csv_datasource::parse_csv(T & stream, } } } - if (!feature_count > 0) + if (feature_count < 1) { MAPNIK_LOG_ERROR(csv) << "CSV Plugin: could not parse any lines of data"; } diff --git a/plugins/input/csv/csv_utils.hpp b/plugins/input/csv/csv_utils.hpp index 127837505..3fdcaa3c8 100644 --- a/plugins/input/csv/csv_utils.hpp +++ b/plugins/input/csv/csv_utils.hpp @@ -29,7 +29,7 @@ namespace csv_utils { - static void fix_json_quoting(std::string & csv_line) + static inline void fix_json_quoting(std::string & csv_line) { std::string wrapping_char; std::string::size_type j_idx = std::string::npos; diff --git a/plugins/input/gdal/build.py b/plugins/input/gdal/build.py index 501ff089f..0e80f3c2a 100644 --- a/plugins/input/gdal/build.py +++ b/plugins/input/gdal/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -21,36 +21,51 @@ Import ('plugin_base') Import ('env') +from copy import copy -prefix = env['PREFIX'] +PLUGIN_NAME = 'gdal' plugin_env = plugin_base.Clone() -gdal_src = Split( +plugin_sources = Split( """ - gdal_datasource.cpp - gdal_featureset.cpp - """ - ) + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + """ % locals() +) -# clear out and rebuild libs -plugin_env['LIBS'] = [env['PLUGINS']['gdal']['lib']] - -# Link Library to Dependencies -plugin_env['LIBS'].append('mapnik') -plugin_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND']) -plugin_env['LIBS'].append(env['ICU_LIB_NAME']) +plugin_env['LIBS'] = [] if env['RUNTIME_LINK'] == 'static': cmd = 'gdal-config --dep-libs' plugin_env.ParseConfig(cmd) - plugin_env['LIBS'].append('proj') -input_plugin = plugin_env.SharedLibrary('../gdal', source=gdal_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LINKFLAGS=env['CUSTOM_LDFLAGS']) +# Link Library to Dependencies +plugin_env.Append(LIBS=env['PLUGINS']['gdal']['lib']) +libraries = copy(plugin_env['LIBS']) -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') + libraries.append(env['ICU_LIB_NAME']) + libraries.append('boost_system%s' % env['BOOST_APPEND']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) + + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/gdal/gdal_datasource.cpp b/plugins/input/gdal/gdal_datasource.cpp index aefcfcef3..ceb6fc86d 100644 --- a/plugins/input/gdal/gdal_datasource.cpp +++ b/plugins/input/gdal/gdal_datasource.cpp @@ -77,7 +77,6 @@ inline GDALDataset* gdal_datasource::open_dataset() const gdal_datasource::gdal_datasource(parameters const& params) : datasource(params), desc_(*params.get("type"), "utf-8"), - filter_factor_(*params.get("filter_factor", 0.0)), nodata_value_(params.get("nodata")) { MAPNIK_LOG_DEBUG(gdal) << "gdal_datasource: Initializing..."; @@ -228,7 +227,6 @@ featureset_ptr gdal_datasource::features(query const& q) const nbands_, dx_, dy_, - filter_factor_, nodata_value_)); } @@ -250,6 +248,5 @@ featureset_ptr gdal_datasource::features_at_point(coord2d const& pt, double tol) nbands_, dx_, dy_, - filter_factor_, nodata_value_)); } diff --git a/plugins/input/gdal/gdal_datasource.hpp b/plugins/input/gdal/gdal_datasource.hpp index 7bd1f33ed..d73682682 100644 --- a/plugins/input/gdal/gdal_datasource.hpp +++ b/plugins/input/gdal/gdal_datasource.hpp @@ -66,7 +66,6 @@ private: double dy_; int nbands_; bool shared_dataset_; - double filter_factor_; boost::optional nodata_value_; }; diff --git a/plugins/input/gdal/gdal_featureset.cpp b/plugins/input/gdal/gdal_featureset.cpp index 780c6ee90..14d6956c4 100644 --- a/plugins/input/gdal/gdal_featureset.cpp +++ b/plugins/input/gdal/gdal_featureset.cpp @@ -61,7 +61,6 @@ gdal_featureset::gdal_featureset(GDALDataset& dataset, int nbands, double dx, double dy, - double filter_factor, boost::optional const& nodata) : dataset_(dataset), ctx_(boost::make_shared()), @@ -73,7 +72,6 @@ gdal_featureset::gdal_featureset(GDALDataset& dataset, dx_(dx), dy_(dy), nbands_(nbands), - filter_factor_(filter_factor), nodata_value_(nodata), first_(true) { @@ -203,21 +201,9 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) int im_width = int(width_res * intersect.width() + 0.5); int im_height = int(height_res * intersect.height() + 0.5); - // if layer-level filter_factor is set, apply it - if (filter_factor_) - { - im_width = int(im_width * filter_factor_ + 0.5); - im_height = int(im_height * filter_factor_ + 0.5); - - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Applying layer filter_factor=" << filter_factor_; - } - // otherwise respect symbolizer level factor applied to query, default of 1.0 - else - { - double sym_downsample_factor = q.get_filter_factor(); - im_width = int(im_width * sym_downsample_factor + 0.5); - im_height = int(im_height * sym_downsample_factor + 0.5); - } + double sym_downsample_factor = q.get_filter_factor(); + im_width = int(im_width * sym_downsample_factor + 0.5); + im_height = int(im_height * sym_downsample_factor + 0.5); // case where we need to avoid upsampling so that the // image can be later scaled within raster_symbolizer @@ -451,7 +437,7 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) { MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Loading colour table..."; - unsigned nodata_value = static_cast(nodata); // FIXME: is it realy unsigned ? + unsigned nodata_value = static_cast(std::floor(nodata+.5)); // FIXME: is it realy unsigned ? if (hasNoData) { feature->put("NODATA",static_cast(nodata_value)); diff --git a/plugins/input/gdal/gdal_featureset.hpp b/plugins/input/gdal/gdal_featureset.hpp index cb6c0b0ff..7315d1279 100644 --- a/plugins/input/gdal/gdal_featureset.hpp +++ b/plugins/input/gdal/gdal_featureset.hpp @@ -49,7 +49,6 @@ public: int nbands, double dx, double dy, - double filter_factor, boost::optional const& nodata); virtual ~gdal_featureset(); mapnik::feature_ptr next(); @@ -72,7 +71,6 @@ private: double dx_; double dy_; int nbands_; - double filter_factor_; boost::optional nodata_value_; bool first_; }; diff --git a/plugins/input/geojson/build.py b/plugins/input/geojson/build.py index f463862a1..f8b2bff9d 100644 --- a/plugins/input/geojson/build.py +++ b/plugins/input/geojson/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2012 Artem Pavlenko +# 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 @@ -17,42 +17,59 @@ # 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 ('env') -can_build = False - +can_build = True 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 >= 47: - can_build = True + if boost_version_from_header < 47: + can_build = False if not can_build: print 'WARNING: skipping building the optional geojson datasource plugin which requires boost >= 1.47' else: Import ('plugin_base') - prefix = env['PREFIX'] + + PLUGIN_NAME = 'geojson' + plugin_env = plugin_base.Clone() - geojson_src = Split( + + plugin_sources = Split( """ - geojson_datasource.cpp - geojson_featureset.cpp - """ - ) - libraries = [] + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + """ % locals() + ) + # Link Library to Dependencies - libraries.append('mapnik') + libraries = [] libraries.append(env['ICU_LIB_NAME']) libraries.append('boost_system%s' % env['BOOST_APPEND']) if env['THREADING'] == 'multi': libraries.append('boost_thread%s' % env['BOOST_APPEND']) - input_plugin = plugin_env.SharedLibrary('../geojson', source=geojson_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) + if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') - # if the plugin links to libmapnik ensure it is built first - Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) - if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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 153597cda..dd5e16723 100644 --- a/plugins/input/geojson/geojson_datasource.cpp +++ b/plugins/input/geojson/geojson_datasource.cpp @@ -39,6 +39,7 @@ // mapnik #include +#include #include #include #include @@ -104,9 +105,24 @@ geojson_datasource::geojson_datasource(parameters const& params) { if (file_.empty()) throw mapnik::datasource_exception("GeoJSON Plugin: missing parameter"); + boost::optional base = params.get("base"); + if (base) + { + file_ = *base + "/" + file_; + } + typedef std::istreambuf_iterator base_iterator_type; - std::ifstream is(file_.c_str()); +#if defined (_WINDOWS) + std::ifstream is(mapnik::utf8_to_utf16(file_),std::ios_base::in | std::ios_base::binary); +#else + std::ifstream is(file_.c_str(),std::ios_base::in | std::ios_base::binary); +#endif + if (!is.is_open()) + { + throw mapnik::datasource_exception("GeoJSON Plugin: could not open: '" + file_ + "'"); + } + boost::spirit::multi_pass begin = boost::spirit::make_default_multi_pass(base_iterator_type(is)); @@ -204,9 +220,17 @@ mapnik::featureset_ptr geojson_datasource::features(mapnik::query const& q) cons return mapnik::featureset_ptr(); } -// FIXME mapnik::featureset_ptr geojson_datasource::features_at_point(mapnik::coord2d const& pt, double tol) const { - throw mapnik::datasource_exception("GeoJSON Plugin: features_at_point is not supported yet"); - return mapnik::featureset_ptr(); + mapnik::box2d query_bbox(pt, pt); + query_bbox.pad(tol); + mapnik::query q(query_bbox); + std::vector const& desc = desc_.get_descriptors(); + std::vector::const_iterator itr = desc.begin(); + std::vector::const_iterator end = desc.end(); + for ( ;itr!=end;++itr) + { + q.add_property_name(itr->get_name()); + } + return features(q); } diff --git a/plugins/input/geos/build.py b/plugins/input/geos/build.py deleted file mode 100644 index e75c7822e..000000000 --- a/plugins/input/geos/build.py +++ /dev/null @@ -1,52 +0,0 @@ -# -# This file is part of Mapnik (c++ mapping toolkit) -# -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon -# -# 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 ('plugin_base') -Import ('env') - -prefix = env['PREFIX'] - -plugin_env = plugin_base.Clone() - -geos_src = Split( - """ - geos_datasource.cpp - geos_featureset.cpp - """ - ) - -libraries = [env['PLUGINS']['geos']['lib']] - -# Link Library to Dependencies -libraries.append('mapnik') -libraries.append(env['ICU_LIB_NAME']) -libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append('boost_filesystem%s' % env['BOOST_APPEND']) - -input_plugin = plugin_env.SharedLibrary('../geos', source=geos_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) - -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) - -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) diff --git a/plugins/input/geos/geos_datasource.cpp b/plugins/input/geos/geos_datasource.cpp deleted file mode 100644 index ef38c79cd..000000000 --- a/plugins/input/geos/geos_datasource.cpp +++ /dev/null @@ -1,317 +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 "geos_datasource.hpp" -#include "geos_featureset.hpp" - -// stl -#include -#include -#include -#include - -// mapnik -#include -#include -#include -#include -#include - -// boost -#include -#include -#include -#include -#include - -// geos -#include - -using mapnik::box2d; -using mapnik::coord2d; -using mapnik::query; -using mapnik::featureset_ptr; -using mapnik::layer_descriptor; -using mapnik::attribute_descriptor; -using mapnik::datasource_exception; -using mapnik::datasource; -using mapnik::parameters; -using mapnik::filter_in_box; - -DATASOURCE_PLUGIN(geos_datasource) - -void geos_notice(const char* format, ...) -{ -#ifdef MAPNIK_LOG - char buffer[512]; - va_list args; - va_start(args, format); - vsnprintf(buffer, 512, format, args); - va_end(args); - - MAPNIK_LOG_WARN(geos) << "geos_datasource: " << buffer; -#endif -} - -void geos_error(const char* format, ...) -{ -#ifdef MAPNIK_LOG - char buffer[512]; - va_list args; - va_start(args, format); - vsnprintf(buffer, 512, format, args); - va_end(args); - - MAPNIK_LOG_ERROR(geos) << "geos_datasource: " << buffer; -#endif -} - - -geos_datasource::geos_datasource(parameters const& params) - : datasource(params), - extent_(), - extent_initialized_(false), - type_(datasource::Vector), - desc_(*params.get("type"), *params.get("encoding", "utf-8")), - geometry_data_(""), - geometry_data_name_("name"), - geometry_id_(1) -{ - boost::optional geometry = params.get("wkt"); - if (! geometry) throw datasource_exception("missing parameter"); - geometry_string_ = *geometry; - - boost::optional ext = params.get("extent"); - if (ext) extent_initialized_ = extent_.from_string(*ext); - - boost::optional id = params.get("gid"); - if (id) geometry_id_ = *id; - - boost::optional gdata = params.get("field_data"); - if (gdata) geometry_data_ = *gdata; - - boost::optional gdata_name = params.get("field_name"); - if (gdata_name) geometry_data_name_ = *gdata_name; - - desc_.add_descriptor(attribute_descriptor(geometry_data_name_, mapnik::String)); - -#ifdef MAPNIK_STATS - mapnik::progress_timer __stats__(std::clog, "geos_datasource::init"); -#endif - - // open geos driver - initGEOS(geos_notice, geos_error); - - // parse the string into geometry - geometry_.set_feature(GEOSGeomFromWKT(geometry_string_.c_str())); - if (*geometry_ == NULL || ! GEOSisValid(*geometry_)) - { - throw datasource_exception("GEOS Plugin: invalid geometry specified"); - } - - // try to obtain the extent from the geometry itself - if (! extent_initialized_) - { -#ifdef MAPNIK_STATS - mapnik::progress_timer __stats2__(std::clog, "geos_datasource::init(initialize_extent)"); -#endif - - MAPNIK_LOG_DEBUG(geos) << "geos_datasource: Initializing extent from geometry"; - - if (GEOSGeomTypeId(*geometry_) == GEOS_POINT) - { - double x, y; - unsigned int size; - - const GEOSCoordSequence* cs = GEOSGeom_getCoordSeq(*geometry_); - - GEOSCoordSeq_getSize(cs, &size); - GEOSCoordSeq_getX(cs, 0, &x); - GEOSCoordSeq_getY(cs, 0, &y); - - extent_.init(x, y, x, y); - extent_initialized_ = true; - } - else - { - geos_feature_ptr envelope (GEOSEnvelope(*geometry_)); - if (*envelope != NULL && GEOSisValid(*envelope)) - { -#ifdef MAPNIK_LOG - char* wkt = GEOSGeomToWKT(*envelope); - MAPNIK_LOG_DEBUG(geos) << "geos_datasource: Getting coord sequence from=" << wkt; - GEOSFree(wkt); -#endif - - const GEOSGeometry* exterior = GEOSGetExteriorRing(*envelope); - if (exterior != NULL && GEOSisValid(exterior)) - { - const GEOSCoordSequence* cs = GEOSGeom_getCoordSeq(exterior); - if (cs != NULL) - { - MAPNIK_LOG_DEBUG(geos) << "geos_datasource: Iterating boundary points"; - - double x, y; - double minx = std::numeric_limits::max(), - miny = std::numeric_limits::max(), - maxx = -std::numeric_limits::max(), - maxy = -std::numeric_limits::max(); - - unsigned int num_points; - GEOSCoordSeq_getSize(cs, &num_points); - - for (unsigned int i = 0; i < num_points; ++i) - { - GEOSCoordSeq_getX(cs, i, &x); - GEOSCoordSeq_getY(cs, i, &y); - - if (x < minx) minx = x; - if (x > maxx) maxx = x; - if (y < miny) miny = y; - if (y > maxy) maxy = y; - } - - extent_.init(minx, miny, maxx, maxy); - extent_initialized_ = true; - } - } - } - } - } - - if (! extent_initialized_) - { - throw datasource_exception("GEOS Plugin: cannot determine extent for geometry"); - } - -} - -geos_datasource::~geos_datasource() -{ - { - geometry_.set_feature(0); - - finishGEOS(); - } -} - - -const char * geos_datasource::name() -{ - return "geos"; -} - -mapnik::datasource::datasource_t geos_datasource::type() const -{ - return type_; -} - -box2d geos_datasource::envelope() const -{ - return extent_; -} - -boost::optional geos_datasource::get_geometry_type() const -{ - boost::optional result; - -#ifdef MAPNIK_STATS - mapnik::progress_timer __stats__(std::clog, "geos_datasource::get_geometry_type"); -#endif - - // get geometry type - const int type = GEOSGeomTypeId(*geometry_); - switch (type) - { - case GEOS_POINT: - case GEOS_MULTIPOINT: - result.reset(mapnik::datasource::Point); - break; - case GEOS_LINESTRING: - case GEOS_LINEARRING: - case GEOS_MULTILINESTRING: - result.reset(mapnik::datasource::LineString); - break; - case GEOS_POLYGON: - case GEOS_MULTIPOLYGON: - result.reset(mapnik::datasource::Polygon); - break; - case GEOS_GEOMETRYCOLLECTION: - result.reset(mapnik::datasource::Collection); - break; - default: - break; - } - - return result; -} - -layer_descriptor geos_datasource::get_descriptor() const -{ - return desc_; -} - -featureset_ptr geos_datasource::features(query const& q) const -{ -#ifdef MAPNIK_STATS - mapnik::progress_timer __stats__(std::clog, "geos_datasource::features"); -#endif - - const mapnik::box2d extent = q.get_bbox(); - - std::ostringstream s; - s << "POLYGON((" - << extent.minx() << " " << extent.miny() << "," - << extent.maxx() << " " << extent.miny() << "," - << extent.maxx() << " " << extent.maxy() << "," - << extent.minx() << " " << extent.maxy() << "," - << extent.minx() << " " << extent.miny() - << "))"; - - MAPNIK_LOG_DEBUG(geos) << "geos_datasource: Using extent=" << s.str(); - - return boost::make_shared(*geometry_, - GEOSGeomFromWKT(s.str().c_str()), - geometry_id_, - geometry_data_, - geometry_data_name_, - desc_.get_encoding()); -} - -featureset_ptr geos_datasource::features_at_point(coord2d const& pt, double tol) const -{ -#ifdef MAPNIK_STATS - mapnik::progress_timer __stats__(std::clog, "geos_datasource::features_at_point"); -#endif - - std::ostringstream s; - s << "POINT(" << pt.x << " " << pt.y << ")"; - - MAPNIK_LOG_DEBUG(geos) << "geos_datasource: Using point=" << s.str(); - - return boost::make_shared(*geometry_, - GEOSGeomFromWKT(s.str().c_str()), - geometry_id_, - geometry_data_, - geometry_data_name_, - desc_.get_encoding()); -} diff --git a/plugins/input/geos/geos_datasource.hpp b/plugins/input/geos/geos_datasource.hpp deleted file mode 100644 index 35bb813ec..000000000 --- a/plugins/input/geos/geos_datasource.hpp +++ /dev/null @@ -1,71 +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 GEOS_DATASOURCE_HPP -#define GEOS_DATASOURCE_HPP - -// mapnik -#include -#include -#include -#include -#include -#include -#include - -// boost -#include -#include - -// stl -#include -#include - -#include "geos_feature_ptr.hpp" - -class geos_datasource : public mapnik::datasource -{ -public: - geos_datasource(mapnik::parameters const& params); - virtual ~geos_datasource (); - mapnik::datasource::datasource_t type() const; - static const char * name(); - 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 envelope() const; - boost::optional get_geometry_type() const; - mapnik::layer_descriptor get_descriptor() const; - -private: - void init(mapnik::parameters const& params); - mapnik::box2d extent_; - bool extent_initialized_; - mapnik::datasource::datasource_t type_; - mapnik::layer_descriptor desc_; - mutable geos_feature_ptr geometry_; - std::string geometry_data_; - std::string geometry_data_name_; - int geometry_id_; - std::string geometry_string_; -}; - -#endif // GEOS_DATASOURCE_HPP diff --git a/plugins/input/geos/geos_feature_ptr.hpp b/plugins/input/geos/geos_feature_ptr.hpp deleted file mode 100644 index 069dc6124..000000000 --- a/plugins/input/geos/geos_feature_ptr.hpp +++ /dev/null @@ -1,108 +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 GEOS_FEATURE_PTR_HPP -#define GEOS_FEATURE_PTR_HPP - -// geos -#include -#include - -class geos_feature_ptr -{ -public: - geos_feature_ptr () - : feat_ (NULL) - { - } - - explicit geos_feature_ptr (GEOSGeometry* const feat) - : feat_ (feat) - { - } - - ~geos_feature_ptr () - { - if (feat_ != NULL) - GEOSGeom_destroy(feat_); - } - - void set_feature (GEOSGeometry* const feat) - { - if (feat_ != NULL) - GEOSGeom_destroy(feat_); - - feat_ = feat; - } - - GEOSGeometry* operator*() - { - return feat_; - } - -private: - GEOSGeometry* feat_; -}; - - -class geos_wkb_ptr -{ -public: - geos_wkb_ptr (GEOSGeometry* const geometry) - : data_ (NULL), - size_ (0) - { - data_ = GEOSGeomToWKB_buf(geometry, &size_); - } - - ~geos_wkb_ptr () - { - if (data_ != NULL) - { - // We use std::free here instead of GEOSFree(data_) to support geos 3.1.0 - std::free(data_); - } - } - - bool is_valid() const - { - return (data_ != NULL) && (size_ > 0); - } - - unsigned int size() const - { - return (unsigned int) size_; - } - - const char* data() - { - return reinterpret_cast(data_); - } - -private: - unsigned char* data_; - size_t size_; -}; - - -#endif // GEOS_FEATURE_PTR_HPP - diff --git a/plugins/input/geos/geos_featureset.cpp b/plugins/input/geos/geos_featureset.cpp deleted file mode 100644 index 339cb46a5..000000000 --- a/plugins/input/geos/geos_featureset.cpp +++ /dev/null @@ -1,129 +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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include "geos_featureset.hpp" - -// boost -#include - -using mapnik::query; -using mapnik::box2d; -using mapnik::feature_ptr; -using mapnik::geometry_utils; -using mapnik::transcoder; -using mapnik::feature_factory; - -geos_featureset::geos_featureset(GEOSGeometry* geometry, - GEOSGeometry* extent, - mapnik::value_integer feature_id, - std::string const& field, - std::string const& field_name, - std::string const& encoding) - : geometry_(geometry), - tr_(new transcoder(encoding)), - extent_(extent), - feature_id_(feature_id), - field_(field), - field_name_(field_name), - already_rendered_(false), - ctx_(boost::make_shared()) -{ - ctx_->push(field_name); -} - -geos_featureset::~geos_featureset() -{ -} - -feature_ptr geos_featureset::next() -{ - if (! already_rendered_) - { - already_rendered_ = true; - - if (GEOSisValid(geometry_) && ! GEOSisEmpty(geometry_)) - { - bool render_geometry = true; - - if (*extent_ != NULL && GEOSisValid(*extent_) && ! GEOSisEmpty(*extent_)) - { - const int type = GEOSGeomTypeId(*extent_); - render_geometry = false; - - switch (type) - { - case GEOS_POINT: - if (GEOSIntersects(*extent_, geometry_)) - { - render_geometry = true; - } - break; - - case GEOS_POLYGON: - if (GEOSContains(*extent_, geometry_) - || GEOSWithin(geometry_, *extent_) - || GEOSEquals(geometry_, *extent_)) - { - render_geometry = true; - } - break; - - default: - MAPNIK_LOG_DEBUG(geos) << "geos_featureset: Unknown extent geometry_type=" << type; - break; - } - } - - if (render_geometry) - { - geos_wkb_ptr wkb(geometry_); - if (wkb.is_valid()) - { - feature_ptr feature(feature_factory::create(ctx_,feature_id_)); - - if (geometry_utils::from_wkb(feature->paths(), - wkb.data(), - wkb.size()) - && field_ != "") - { - feature->put(field_name_, tr_->transcode(field_.c_str())); - } - - return feature; - } - } - } - } - - return feature_ptr(); -} diff --git a/plugins/input/geos/geos_featureset.hpp b/plugins/input/geos/geos_featureset.hpp deleted file mode 100644 index 3180449ed..000000000 --- a/plugins/input/geos/geos_featureset.hpp +++ /dev/null @@ -1,66 +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 GEOS_FEATURESET_HPP -#define GEOS_FEATURESET_HPP - -// mapnik -#include -#include -#include -#include - -// boost -#include - -// geos -#include - -#include "geos_feature_ptr.hpp" - -class geos_featureset : public mapnik::Featureset -{ -public: - geos_featureset(GEOSGeometry* geometry, - GEOSGeometry* extent, - mapnik::value_integer feature_id, - std::string const& field, - std::string const& field_name, - std::string const& encoding); - virtual ~geos_featureset(); - mapnik::feature_ptr next(); - -private: - GEOSGeometry* geometry_; - boost::scoped_ptr tr_; - geos_feature_ptr extent_; - mapnik::value_integer feature_id_; - std::string field_; - std::string field_name_; - bool already_rendered_; - mapnik::context_ptr ctx_; - - geos_featureset(const geos_featureset&); - const geos_featureset& operator=(const geos_featureset&); -}; - -#endif // GEOS_FEATURESET_HPP diff --git a/plugins/input/kismet/build.py b/plugins/input/kismet/build.py deleted file mode 100644 index d85ced8e1..000000000 --- a/plugins/input/kismet/build.py +++ /dev/null @@ -1,51 +0,0 @@ -# -# This file is part of Mapnik (c++ mapping toolkit) -# -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon -# -# 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 ('plugin_base') -Import ('env') - -prefix = env['PREFIX'] - -plugin_env = plugin_base.Clone() - -kismet_src = Split( - """ - kismet_datasource.cpp - kismet_featureset.cpp - """ - ) - -libraries = [] -# Link Library to Dependencies -libraries.append('mapnik') -libraries.append(env['ICU_LIB_NAME']) -libraries.append('boost_system%s' % env['BOOST_APPEND']) -if env['THREADING'] == 'multi': - libraries.append('boost_thread%s' % env['BOOST_APPEND']) - -input_plugin = plugin_env.SharedLibrary('../kismet', source=kismet_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) - -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) - -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) diff --git a/plugins/input/kismet/kismet_datasource.cpp b/plugins/input/kismet/kismet_datasource.cpp deleted file mode 100644 index 96348e151..000000000 --- a/plugins/input/kismet/kismet_datasource.cpp +++ /dev/null @@ -1,291 +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 - * - *****************************************************************************/ - -// network -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// mapnik -#include -#include - -// boost -#include -#include -#include -#include - -#include "kismet_datasource.hpp" -#include "kismet_featureset.hpp" - -#define MAX_TCP_BUFFER 4096 // maximum accepted TCP data block size - -// If you change this also change the according kismet command length ! -#define MAX_KISMET_LINE 1024 // maximum length of a kismet command (assumed) -#define KISMET_COMMAND "*NETWORK: \001%1024[^\001]\001 %1024s %d %lf %lf" - -using mapnik::datasource; -using mapnik::parameters; - -DATASOURCE_PLUGIN(kismet_datasource) - -using mapnik::box2d; -using mapnik::coord2d; -using mapnik::query; -using mapnik::featureset_ptr; -using mapnik::layer_descriptor; -using mapnik::attribute_descriptor; -using mapnik::datasource_exception; - -boost::mutex knd_list_mutex; -std::list knd_list; -const unsigned int queue_size = 20; - -kismet_datasource::kismet_datasource(parameters const& params) - : datasource(params), - extent_(), - extent_initialized_(false), - type_(datasource::Vector), - srs_("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"), - desc_(*params.get("type"), *params.get("encoding","utf-8")) -{ - boost::optional host = params.get("host"); - if (host) - { - host_ = *host; - } - else - { - throw datasource_exception("Kismet Plugin: missing parameter"); - } - - boost::optional port = params.get("port", 2501); - if (port) - { - port_ = static_cast(*port); - } - - boost::optional srs = params.get("srs"); - if (srs) - { - srs_ = *srs; - } - - boost::optional ext = params.get("extent"); - if (ext) - { - extent_initialized_ = extent_.from_string(*ext); - } - - kismet_thread.reset(new boost::thread(boost::bind(&kismet_datasource::run, this, host_, port_))); -} - -kismet_datasource::~kismet_datasource() -{ -} - -const char * kismet_datasource::name() -{ - return "kismet"; -} - -mapnik::datasource::datasource_t kismet_datasource::type() const -{ - return type_; -} - -box2d kismet_datasource::envelope() const -{ - return extent_; -} - -boost::optional kismet_datasource::get_geometry_type() const -{ - return boost::optional(mapnik::datasource::Point); -} - -layer_descriptor kismet_datasource::get_descriptor() const -{ - return desc_; -} - -featureset_ptr kismet_datasource::features(query const& q) const -{ - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource::features()"; - - // TODO: use box2d to filter bbox before adding to featureset_ptr - // mapnik::box2d const& e = q.get_bbox(); - - boost::mutex::scoped_lock lock(knd_list_mutex); - return boost::make_shared(knd_list, - srs_, - desc_.get_encoding()); - - // TODO: if illegal: - // return featureset_ptr(); -} - -featureset_ptr kismet_datasource::features_at_point(coord2d const& pt, double tol) const -{ - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource::features_at_point()"; - - return featureset_ptr(); -} - -void kismet_datasource::run(std::string const& ip_host, const unsigned int port) -{ - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource: Enter run"; - - int sockfd, n; - struct sockaddr_in sock_addr; - struct in_addr inadr; - struct hostent* host; - char buffer[MAX_TCP_BUFFER]; // TCP data send from kismet_server - std::string command; - - if (inet_aton(ip_host.c_str(), &inadr)) - { - host = gethostbyaddr((char*)&inadr, sizeof(inadr), AF_INET); - } - else - { - host = gethostbyname(ip_host.c_str()); - } - - if (host == NULL) - { - MAPNIK_LOG_ERROR(kismet) << "Kismet Plugin: error while searching host"; - return; - } - - sock_addr.sin_family = AF_INET; - sock_addr.sin_port = htons(port); - memcpy(&sock_addr.sin_addr, host->h_addr_list[0], sizeof(sock_addr.sin_addr)); - - if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) - { - MAPNIK_LOG_ERROR(kismet) << "Kismet Plugin: error while creating socket"; - return; - } - - if (connect(sockfd, (struct sockaddr*) &sock_addr, sizeof(sock_addr))) - { - MAPNIK_LOG_ERROR(kismet) << "Kismet Plugin: Error while connecting"; - return; - } - - command = "!1 ENABLE NETWORK ssid,bssid,wep,bestlat,bestlon\n"; - - if (write(sockfd, command.c_str(), command.length()) != (signed)command.length()) - { - MAPNIK_LOG_ERROR(kismet) << "Kismet Plugin: Error sending command to " << ip_host; - - close(sockfd); - return; - } - - char ssid[MAX_KISMET_LINE] = {}; - char bssid[MAX_KISMET_LINE] = {}; - double bestlat = 0; - double bestlon = 0; - int crypt = crypt_none; - - // BUG: if kismet_server is active sending after mapnik was killed and then restarted the - // assert is called. Needs to be analyzed! - while ((n = read(sockfd, buffer, sizeof(buffer))) > 0) - { - assert(n < MAX_TCP_BUFFER); - - buffer[n] = '\0'; - std::string bufferObj(buffer); // TCP data send from kismet_server as STL string - - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource: buffer_obj=" << bufferObj; - - std::string::size_type found = 0; - std::string::size_type search_start = 0; - std::string kismet_line; // contains a line from kismet_server - do - { - found = bufferObj.find('\n', search_start); - if (found != std::string::npos) - { - kismet_line.assign(bufferObj, search_start, found - search_start); - - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource: line=" << kismet_line; - - int param_number = 5; // the number of parameters to parse - - // Attention: string length specified to the constant! - if (sscanf (kismet_line.c_str(), - KISMET_COMMAND, - ssid, - bssid, - &crypt, - &bestlat, - &bestlon) == param_number) - { - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource: ssid=" << ssid - << ", bssid=" << bssid - << ", crypt=" << crypt - << ", bestlat=" << bestlat - << ", bestlon=" << bestlon; - - kismet_network_data knd(ssid, bssid, bestlat, bestlon, crypt); - - boost::mutex::scoped_lock lock(knd_list_mutex); - - // the queue only grows to a max size - if (knd_list.size () >= queue_size) - { - knd_list.pop_front(); - } - - knd_list.push_back(knd); - } - else - { - // do nothing if not matched! - } - - search_start = found + 1; - } - } - while (found != std::string::npos); - } - - if (n < 0) - { - MAPNIK_LOG_ERROR(kismet) << "Kismet Plugin: error while reading from socket"; - } - - close(sockfd); - - MAPNIK_LOG_DEBUG(kismet) << "kismet_datasource: Exit run"; -} - diff --git a/plugins/input/kismet/kismet_datasource.hpp b/plugins/input/kismet/kismet_datasource.hpp deleted file mode 100644 index 272a15ddd..000000000 --- a/plugins/input/kismet/kismet_datasource.hpp +++ /dev/null @@ -1,73 +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 KISMET_DATASOURCE_HPP -#define KISMET_DATASOURCE_HPP - -// mapnik -#include -#include -#include -#include -#include -#include -#include - -// boost -#include -#include -#include - -// stl -#include -#include -#include - -#include "kismet_types.hpp" - -class kismet_datasource : public mapnik::datasource -{ -public: - kismet_datasource(mapnik::parameters const& params); - virtual ~kismet_datasource (); - datasource::datasource_t type() const; - static const char * name(); - 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 envelope() const; - boost::optional get_geometry_type() const; - mapnik::layer_descriptor get_descriptor() const; - -private: - void run (std::string const& host, const unsigned int port); - - mapnik::box2d extent_; - bool extent_initialized_; - std::string host_; - unsigned int port_; - mapnik::datasource::datasource_t type_; - std::string srs_; - mapnik::layer_descriptor desc_; - boost::shared_ptr kismet_thread; -}; - -#endif // KISMET_DATASOURCE_HPP diff --git a/plugins/input/kismet/kismet_featureset.cpp b/plugins/input/kismet/kismet_featureset.cpp deleted file mode 100644 index edd4ec95c..000000000 --- a/plugins/input/kismet/kismet_featureset.cpp +++ /dev/null @@ -1,97 +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 -#include -#include -#include -#include -#include -#include -#include - -#include "kismet_featureset.hpp" - -// boost -#include - -using mapnik::feature_ptr; -using mapnik::geometry_type; -using mapnik::geometry_utils; -using mapnik::transcoder; -using mapnik::feature_factory; - -kismet_featureset::kismet_featureset(std::list const& knd_list, - std::string const& srs, - std::string const& encoding) - : knd_list_(knd_list), - tr_(new transcoder(encoding)), - feature_id_(1), - knd_list_it(knd_list_.begin()), - source_(srs), - ctx_(boost::make_shared()) -{ - ctx_->push("internet_access"); -} - -kismet_featureset::~kismet_featureset() -{ -} - -feature_ptr kismet_featureset::next() -{ - if (knd_list_it != knd_list_.end ()) - { - const kismet_network_data& knd = *knd_list_it; - const std::string key = "internet_access"; - - std::string value; - if (knd.crypt() == crypt_none) - { - value = "wlan_uncrypted"; - } - else if (knd.crypt() == crypt_wep) - { - value = "wlan_wep"; - } - else - { - value = "wlan_crypted"; - } - - feature_ptr feature(feature_factory::create(ctx_,feature_id_)); - ++feature_id_; - - geometry_type* pt = new geometry_type(mapnik::Point); - pt->move_to(knd.bestlon(), knd.bestlat()); - feature->add_geometry(pt); - - feature->put(key, tr_->transcode(value.c_str())); - - ++knd_list_it; - - return feature; - } - - return feature_ptr(); -} diff --git a/plugins/input/kismet/kismet_types.hpp b/plugins/input/kismet/kismet_types.hpp deleted file mode 100644 index ea9ff856a..000000000 --- a/plugins/input/kismet/kismet_types.hpp +++ /dev/null @@ -1,111 +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 KISMET_TYPES_HPP -#define KISMET_TYPES_HPP - -// mapnik -#include - -// boost -#include - -// this is a copy from packet.h from kismet 2007.10.R1 -enum crypt_type -{ - crypt_none = 0, - crypt_unknown = 1, - crypt_wep = 2, - crypt_layer3 = 4, - // Derived from WPA headers - crypt_wep40 = 8, - crypt_wep104 = 16, - crypt_tkip = 32, - crypt_wpa = 64, - crypt_psk = 128, - crypt_aes_ocb = 256, - crypt_aes_ccm = 512, - // Derived from data traffic - crypt_leap = 1024, - crypt_ttls = 2048, - crypt_tls = 4096, - crypt_peap = 8192, - crypt_isakmp = 16384, - crypt_pptp = 32768, - crypt_ccmp = 65536 -}; - -class kismet_network_data -{ -public: - kismet_network_data() - : bestlat_(0), bestlon_(0), crypt_(crypt_none) - { - } - - kismet_network_data(std::string ssid, - std::string bssid, - double bestlat, - double bestlon, - int crypt) - : ssid_(ssid), - bssid_(bssid), - bestlat_(bestlat), - bestlon_(bestlon), - crypt_(crypt) - { - } - - std::string const& ssid() const - { - return ssid_; - } - - std::string const& bssid() const - { - return bssid_; - } - - double bestlat() const - { - return bestlat_; - } - - double bestlon() const - { - return bestlon_; - } - - int crypt() const - { - return crypt_; - } - -protected: - std::string ssid_; - std::string bssid_; - double bestlat_; - double bestlon_; - int crypt_; -}; - -#endif // KISMET_TYPES_HPP diff --git a/plugins/input/occi/build.py b/plugins/input/occi/build.py index 050cbce9b..946d32dbb 100644 --- a/plugins/input/occi/build.py +++ b/plugins/input/occi/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,35 +17,49 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'occi' plugin_env = plugin_base.Clone() -occi_src = Split( +plugin_sources = Split( """ - occi_types.cpp - occi_datasource.cpp - occi_featureset.cpp + %(PLUGIN_NAME)s_types.cpp + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp spatial_classesm.cpp spatial_classeso.cpp - """ - ) + """ % locals() +) libraries = [ 'occi', 'ociei' ] -libraries.append('mapnik') libraries.append('boost_system%s' % env['BOOST_APPEND']) libraries.append(env['ICU_LIB_NAME']) -input_plugin = plugin_env.SharedLibrary('../occi', source=occi_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/occi/occi_datasource.cpp b/plugins/input/occi/occi_datasource.cpp index 320662eb2..6111c7049 100644 --- a/plugins/input/occi/occi_datasource.cpp +++ b/plugins/input/occi/occi_datasource.cpp @@ -61,6 +61,7 @@ using oracle::occi::SQLException; using oracle::occi::Type; using oracle::occi::StatelessConnectionPool; +const double occi_datasource::FMAX = std::numeric_limits::max(); const std::string occi_datasource::METADATA_TABLE = "USER_SDO_GEOM_METADATA"; DATASOURCE_PLUGIN(occi_datasource) @@ -72,6 +73,10 @@ occi_datasource::occi_datasource(parameters const& params) geometry_field_(*params.get("geometry_field", "")), srid_initialized_(false), extent_initialized_(false), + bbox_token_("!bbox!"), + scale_denom_token_("!scale_denominator!"), + pixel_width_token_("!pixel_width!"), + pixel_height_token_("!pixel_height!"), desc_(*params.get("type"), *params.get("encoding", "utf-8")), use_wkb_(*params.get("use_wkb", false)), row_limit_(*params.get("row_limit", 0)), @@ -115,16 +120,13 @@ occi_datasource::occi_datasource(parameters const& params) { try { - Environment* env = occi_environment::get_environment(); - - pool_ = env->createStatelessConnectionPool( + pool_ = occi_environment::instance().create_pool( *params.get("user"), *params.get("password"), *params.get("host"), *params.get("max_size", 5), *params.get("initial_size", 1), - 1, - StatelessConnectionPool::HOMOGENEOUS); + 1); } catch (SQLException& ex) { @@ -135,9 +137,7 @@ occi_datasource::occi_datasource(parameters const& params) { try { - Environment* env = occi_environment::get_environment(); - - conn_ = env->createConnection( + conn_ = occi_environment::instance().create_connection( *params.get("user"), *params.get("password"), *params.get("host")); @@ -203,7 +203,7 @@ occi_datasource::occi_datasource(parameters const& params) #endif std::ostringstream s; - s << "SELECT " << fields_ << " FROM (" << table_name_ << ") WHERE rownum < 1"; + s << "SELECT " << fields_ << " FROM (" << table_name_ << ") WHERE ROWNUM < 1"; MAPNIK_LOG_DEBUG(occi) << "occi_datasource: " << s.str(); @@ -247,10 +247,10 @@ occi_datasource::occi_datasource(parameters const& params) case oracle::occi::OCCIBFLOAT: case oracle::occi::OCCIDOUBLE: case oracle::occi::OCCIBDOUBLE: - desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double)); - break; case oracle::occi::OCCINUMBER: case oracle::occi::OCCI_SQLT_NUM: + desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double)); + break; case oracle::occi::OCCICHAR: case oracle::occi::OCCISTRING: case oracle::occi::OCCI_SQLT_AFC: @@ -263,12 +263,12 @@ occi_datasource::occi_datasource(parameters const& params) case oracle::occi::OCCI_SQLT_VNU: case oracle::occi::OCCI_SQLT_VBI: case oracle::occi::OCCI_SQLT_VST: - case oracle::occi::OCCIDATE: - case oracle::occi::OCCI_SQLT_DAT: - case oracle::occi::OCCI_SQLT_DATE: case oracle::occi::OCCIROWID: case oracle::occi::OCCI_SQLT_RDD: case oracle::occi::OCCI_SQLT_RID: + case oracle::occi::OCCIDATE: + case oracle::occi::OCCI_SQLT_DAT: + case oracle::occi::OCCI_SQLT_DATE: case oracle::occi::OCCI_SQLT_TIME: case oracle::occi::OCCI_SQLT_TIME_TZ: case oracle::occi::OCCITIMESTAMP: @@ -320,22 +320,18 @@ occi_datasource::occi_datasource(parameters const& params) occi_datasource::~occi_datasource() { + if (use_connection_pool_) { - Environment* env = occi_environment::get_environment(); - - if (use_connection_pool_) + if (pool_ != 0) { - if (pool_ != 0) - { - env->terminateStatelessConnectionPool(pool_, StatelessConnectionPool::SPD_FORCE); - } + occi_environment::instance().destroy_pool(pool_); } - else + } + else + { + if (conn_ != 0) { - if (conn_ != 0) - { - env->terminateConnection(conn_); - } + occi_environment::instance().destroy_connection(conn_); } } } @@ -458,6 +454,51 @@ layer_descriptor occi_datasource::get_descriptor() const return desc_; } +std::string occi_datasource::sql_bbox(box2d const& env) const +{ + std::ostringstream b; + b << std::setprecision(16); + b << "MDSYS.SDO_GEOMETRY(" << SDO_GTYPE_2DPOLYGON << "," << srid_ << ",NULL,"; + b << " MDSYS.SDO_ELEM_INFO_ARRAY(1," << SDO_ETYPE_POLYGON << "," << SDO_INTERPRETATION_RECTANGLE << "),"; + b << " MDSYS.SDO_ORDINATE_ARRAY("; + b << env.minx() << "," << env.miny() << ", "; + b << env.maxx() << "," << env.maxy() << "))"; + return b.str(); +} + +std::string occi_datasource::populate_tokens(std::string const& sql, double scale_denom, box2d const& env, double pixel_width, double pixel_height) const +{ + std::string populated_sql = sql; + + if (boost::algorithm::icontains(populated_sql, scale_denom_token_)) + { + std::ostringstream ss; + ss << scale_denom; + boost::algorithm::replace_all(populated_sql, scale_denom_token_, ss.str()); + } + + if (boost::algorithm::icontains(sql, pixel_width_token_)) + { + std::ostringstream ss; + ss << pixel_width; + boost::algorithm::replace_all(populated_sql, pixel_width_token_, ss.str()); + } + + if (boost::algorithm::icontains(sql, pixel_height_token_)) + { + std::ostringstream ss; + ss << pixel_height; + boost::algorithm::replace_all(populated_sql, pixel_height_token_, ss.str()); + } + + if (boost::algorithm::icontains(populated_sql, bbox_token_)) + { + boost::algorithm::replace_all(populated_sql, bbox_token_, sql_bbox(env)); + } + + return populated_sql; +} + featureset_ptr occi_datasource::features(query const& q) const { #ifdef MAPNIK_STATS @@ -465,6 +506,9 @@ featureset_ptr occi_datasource::features(query const& q) const #endif box2d const& box = q.get_bbox(); + const double px_gw = 1.0 / boost::get<0>(q.resolution()); + const double px_gh = 1.0 / boost::get<1>(q.resolution()); + const double scale_denom = q.scale_denominator(); std::ostringstream s; s << "SELECT "; @@ -486,20 +530,14 @@ featureset_ptr occi_datasource::features(query const& q) const ctx->push(*pos); } - s << " FROM "; - - std::string query(table_); + std::string query = populate_tokens(table_, scale_denom, box, px_gw, px_gh); if (use_spatial_index_) { std::ostringstream spatial_sql; - spatial_sql << std::setprecision(16); - spatial_sql << " WHERE SDO_FILTER(" << geometry_field_ << ","; - spatial_sql << " MDSYS.SDO_GEOMETRY(" << SDO_GTYPE_2DPOLYGON << "," << srid_ << ",NULL,"; - spatial_sql << " MDSYS.SDO_ELEM_INFO_ARRAY(1," << SDO_ETYPE_POLYGON << "," << SDO_INTERPRETATION_RECTANGLE << "),"; - spatial_sql << " MDSYS.SDO_ORDINATE_ARRAY("; - spatial_sql << box.minx() << "," << box.miny() << ", "; - spatial_sql << box.maxx() << "," << box.maxy() << ")), 'querytype=WINDOW') = 'TRUE'"; + spatial_sql << " WHERE SDO_FILTER("; + spatial_sql << geometry_field_ << "," << sql_bbox(box); + spatial_sql << ", 'querytype = WINDOW') = 'TRUE'"; if (boost::algorithm::ifind_first(query, "WHERE")) { @@ -515,36 +553,23 @@ featureset_ptr occi_datasource::features(query const& q) const } } + s << " FROM " << query; + if (row_limit_ > 0) { - std::ostringstream row_limit_string; - row_limit_string << "rownum < " << row_limit_; - if (boost::algorithm::ifind_first(query, "WHERE")) - { - boost::algorithm::ireplace_first(query, "WHERE", row_limit_string.str() + " AND "); - } - else if (boost::algorithm::ifind_first(query, table_name_)) - { - boost::algorithm::ireplace_first(query, table_name_, table_name_ + " " + row_limit_string.str()); - } - else - { - MAPNIK_LOG_WARN(occi) << "occi_datasource: Cannot determine where to add the row limit declaration"; - } + s << " WHERE ROWNUM < " << row_limit_; } - s << query; - MAPNIK_LOG_DEBUG(occi) << "occi_datasource: " << s.str(); return boost::make_shared(pool_, - conn_, - ctx, - s.str(), - desc_.get_encoding(), - use_connection_pool_, - use_wkb_, - row_prefetch_); + conn_, + ctx, + s.str(), + desc_.get_encoding(), + use_connection_pool_, + use_wkb_, + row_prefetch_); } featureset_ptr occi_datasource::features_at_point(coord2d const& pt, double tol) const @@ -573,19 +598,15 @@ featureset_ptr occi_datasource::features_at_point(coord2d const& pt, double tol) ++itr; } - s << " FROM "; - - std::string query(table_); + box2d box(pt.x - tol, pt.y - tol, pt.x + tol, pt.y + tol); + std::string query = populate_tokens(table_, FMAX, box, 0, 0); if (use_spatial_index_) { std::ostringstream spatial_sql; - spatial_sql << std::setprecision(16); - spatial_sql << " WHERE SDO_FILTER(" << geometry_field_ << ","; - spatial_sql << " MDSYS.SDO_GEOMETRY(" << SDO_GTYPE_2DPOINT << "," << srid_ << ",NULL,"; - spatial_sql << " MDSYS.SDO_ELEM_INFO_ARRAY(1," << SDO_ETYPE_POINT << "," << SDO_INTERPRETATION_POINT << "),"; - spatial_sql << " MDSYS.SDO_ORDINATE_ARRAY("; - spatial_sql << pt.x << "," << pt.y << ")), 'querytype=WINDOW') = 'TRUE'"; + spatial_sql << " WHERE SDO_FILTER("; + spatial_sql << geometry_field_ << "," << sql_bbox(box); + spatial_sql << ", 'querytype = WINDOW') = 'TRUE'"; if (boost::algorithm::ifind_first(query, "WHERE")) { @@ -601,34 +622,21 @@ featureset_ptr occi_datasource::features_at_point(coord2d const& pt, double tol) } } + s << " FROM " << query; + if (row_limit_ > 0) { - std::ostringstream row_limit_string; - row_limit_string << "rownum < " << row_limit_; - if (boost::algorithm::ifind_first(query, "WHERE")) - { - boost::algorithm::ireplace_first(query, "WHERE", row_limit_string.str() + " AND "); - } - else if (boost::algorithm::ifind_first(query, table_name_)) - { - boost::algorithm::ireplace_first(query, table_name_, table_name_ + " " + row_limit_string.str()); - } - else - { - MAPNIK_LOG_WARN(occi) << "occi_datasource: Cannot determine where to add the row limit declaration"; - } + s << " WHERE ROWNUM < " << row_limit_; } - s << query; - MAPNIK_LOG_DEBUG(occi) << "occi_datasource: " << s.str(); return boost::make_shared(pool_, - conn_, - ctx, - s.str(), - desc_.get_encoding(), - use_connection_pool_, - use_wkb_, - row_prefetch_); + conn_, + ctx, + s.str(), + desc_.get_encoding(), + use_connection_pool_, + use_wkb_, + row_prefetch_); } diff --git a/plugins/input/occi/occi_datasource.hpp b/plugins/input/occi/occi_datasource.hpp index 18478f738..10261f19a 100644 --- a/plugins/input/occi/occi_datasource.hpp +++ b/plugins/input/occi/occi_datasource.hpp @@ -58,7 +58,15 @@ public: mapnik::layer_descriptor get_descriptor() const; private: + std::string sql_bbox(mapnik::box2d const& env) const; + std::string populate_tokens(std::string const& sql, + double scale_denom, + mapnik::box2d const& env, + double pixel_width, + double pixel_height) const; + static const std::string METADATA_TABLE; + static const double FMAX; mapnik::datasource::datasource_t type_; std::string table_; @@ -69,6 +77,10 @@ private: bool srid_initialized_; mutable bool extent_initialized_; mutable mapnik::box2d extent_; + const std::string bbox_token_; + const std::string scale_denom_token_; + const std::string pixel_width_token_; + const std::string pixel_height_token_; mapnik::layer_descriptor desc_; bool use_wkb_; mapnik::value_integer row_limit_; diff --git a/plugins/input/occi/occi_featureset.cpp b/plugins/input/occi/occi_featureset.cpp index c902520ae..9a2eb67b1 100644 --- a/plugins/input/occi/occi_featureset.cpp +++ b/plugins/input/occi/occi_featureset.cpp @@ -61,7 +61,8 @@ occi_featureset::occi_featureset(StatelessConnectionPool* pool, bool use_connection_pool, bool use_wkb, unsigned prefetch_rows) - : tr_(new transcoder(encoding)), + : rs_(NULL), + tr_(new transcoder(encoding)), feature_id_(1), ctx_(ctx), use_wkb_(use_wkb) @@ -82,6 +83,8 @@ occi_featureset::occi_featureset(StatelessConnectionPool* pool, catch (SQLException &ex) { MAPNIK_LOG_ERROR(occi) << "OCCI Plugin: error processing " << sqlstring << " : " << ex.getMessage(); + + rs_ = NULL; } } @@ -91,28 +94,30 @@ occi_featureset::~occi_featureset() feature_ptr occi_featureset::next() { - if (rs_ && rs_->next()) + while (rs_ != NULL && rs_->next() == oracle::occi::ResultSet::DATA_AVAILABLE) { - feature_ptr feature(feature_factory::create(ctx_,feature_id_)); - ++feature_id_; + feature_ptr feature(feature_factory::create(ctx_, feature_id_)); if (use_wkb_) { Blob blob = rs_->getBlob(1); blob.open(oracle::occi::OCCI_LOB_READONLY); - int size = blob.length(); + unsigned int size = blob.length(); if (buffer_.size() < size) { buffer_.resize(size); } - oracle::occi::Stream* instream = blob.getStream(1,0); + oracle::occi::Stream* instream = blob.getStream(1, 0); instream->readBuffer(buffer_.data(), size); blob.closeStream(instream); blob.close(); - geometry_utils::from_wkb(feature->paths(), buffer_.data(), size); + if (! geometry_utils::from_wkb(feature->paths(), buffer_.data(), size)) + { + continue; + } } else { @@ -121,6 +126,10 @@ feature_ptr occi_featureset::next() { convert_geometry(geom.get(), feature); } + else + { + continue; + } } std::vector listOfColumns = rs_->getColumnListMetaData(); @@ -155,10 +164,10 @@ feature_ptr occi_featureset::next() break; case oracle::occi::OCCIDOUBLE: case oracle::occi::OCCIBDOUBLE: - feature->put(fld_name, rs_->getDouble(i + 1)); - break; case oracle::occi::OCCINUMBER: case oracle::occi::OCCI_SQLT_NUM: + feature->put(fld_name, rs_->getDouble(i + 1)); + break; case oracle::occi::OCCICHAR: case oracle::occi::OCCISTRING: case oracle::occi::OCCI_SQLT_AFC: @@ -222,6 +231,8 @@ feature_ptr occi_featureset::next() } } + ++feature_id_; + return feature; } diff --git a/plugins/input/occi/occi_types.cpp b/plugins/input/occi/occi_types.cpp index 4ea5556e9..0545b80fa 100644 --- a/plugins/input/occi/occi_types.cpp +++ b/plugins/input/occi/occi_types.cpp @@ -22,8 +22,6 @@ #include "occi_types.hpp" -oracle::occi::Environment* occi_environment::env_ = 0; - std::string occi_enums::resolve_gtype(int gtype) { switch (gtype) diff --git a/plugins/input/occi/occi_types.hpp b/plugins/input/occi/occi_types.hpp index d9f29d3e8..896219a62 100644 --- a/plugins/input/occi/occi_types.hpp +++ b/plugins/input/occi/occi_types.hpp @@ -27,6 +27,11 @@ #include #include +// boost +#ifdef MAPNIK_THREADSAFE +#include +#endif + // occi #include @@ -84,48 +89,83 @@ class occi_environment : public mapnik::singletoncreateConnection(user, password, host); + } + + void destroy_connection(oracle::occi::Connection* conn) + { + env_->terminateConnection(conn); + } + + oracle::occi::StatelessConnectionPool* create_pool( + const std::string& user, + const std::string& password, + const std::string& host, + int max_size, + int initial_size, + int incr_size) + { + MAPNIK_LOG_DEBUG(occi) << "occi_environment: create_pool"; + + return env_->createStatelessConnectionPool( + user, + password, + host, + max_size, + initial_size, + incr_size, + oracle::occi::StatelessConnectionPool::HOMOGENEOUS); + } + + void destroy_pool(oracle::occi::StatelessConnectionPool* pool) + { + env_->terminateStatelessConnectionPool( + pool, + oracle::occi::StatelessConnectionPool::SPD_FORCE); + } + private: occi_environment() + : env_(0) { + MAPNIK_LOG_DEBUG(occi) << "occi_environment: constructor"; + + env_ = oracle::occi::Environment::createEnvironment( + (oracle::occi::Environment::Mode)(oracle::occi::Environment::OBJECT + | oracle::occi::Environment::THREADED_MUTEXED)); + RegisterClasses(env_); } ~occi_environment() { - if (env_) - { - MAPNIK_LOG_DEBUG(occi) << "occi_environment: destructor"; + MAPNIK_LOG_DEBUG(occi) << "occi_environment: destructor"; - oracle::occi::Environment::terminateEnvironment(env_); - env_ = 0; - } + oracle::occi::Environment::terminateEnvironment(env_); + env_ = 0; } - static oracle::occi::Environment* env_; + oracle::occi::Environment* env_; }; + class occi_connection_ptr { public: explicit occi_connection_ptr() - : env_(occi_environment::get_environment()), - pool_(0), + : pool_(0), conn_(0), stmt_(0), rs_(0), @@ -175,11 +215,6 @@ public: return rs_; } - oracle::occi::Connection* operator*() - { - return conn_; - } - private: void close_query(const bool release_connection) { @@ -207,7 +242,7 @@ private: { if (owns_connection_) { - env_->terminateConnection(conn_); + occi_environment::instance().destroy_connection(conn_); } } @@ -216,7 +251,6 @@ private: } } - oracle::occi::Environment* env_; oracle::occi::StatelessConnectionPool* pool_; oracle::occi::Connection* conn_; oracle::occi::Statement* stmt_; diff --git a/plugins/input/ogr/build.py b/plugins/input/ogr/build.py index 26512b856..b66f6a9a9 100644 --- a/plugins/input/ogr/build.py +++ b/plugins/input/ogr/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,50 +17,69 @@ # 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 ('plugin_base') Import ('env') +from copy import copy -prefix = env['PREFIX'] +PLUGIN_NAME = 'ogr' plugin_env = plugin_base.Clone() -ogr_src = Split( +plugin_sources = Split( """ - ogr_converter.cpp - ogr_datasource.cpp - ogr_featureset.cpp - ogr_index_featureset.cpp - """ - ) + %(PLUGIN_NAME)s_converter.cpp + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + %(PLUGIN_NAME)s_index_featureset.cpp + """ % locals() +) -plugin_env['LIBS'] = [env['PLUGINS']['ogr']['lib']] -# Link Library to Dependencies -plugin_env['LIBS'].append('mapnik') -plugin_env['LIBS'].append(env['ICU_LIB_NAME']) -plugin_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND']) -plugin_env['LIBS'].append('boost_filesystem%s' % env['BOOST_APPEND']) +cxxflags = [] +plugin_env['LIBS'] = [] if env['RUNTIME_LINK'] == 'static': cmd = 'gdal-config --dep-libs' plugin_env.ParseConfig(cmd) - plugin_env['LIBS'].append('proj') + +# Link Library to Dependencies +plugin_env.Append(LIBS=env['PLUGINS']['ogr']['lib']) +libraries = copy(plugin_env['LIBS']) 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 < 46: # avoid ubuntu issue with boost interprocess: # https://github.com/mapnik/mapnik/issues/1082 - plugin_env.Append(CXXFLAGS = '-fpermissive') + cxxflags.append('-fpermissive') -input_plugin = plugin_env.SharedLibrary('../ogr', source=ogr_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LINKFLAGS=env['CUSTOM_LDFLAGS']) +plugin_env.Append(CXXFLAGS=cxxflags) -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') + libraries.append(env['ICU_LIB_NAME']) + libraries.append('boost_system%s' % env['BOOST_APPEND']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) + + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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 = { + 'CXXFLAGS': cxxflags, + 'LIBS': libraries, + 'SOURCES': plugin_sources, +} + +Return('plugin_obj') diff --git a/plugins/input/ogr/ogr_converter.cpp b/plugins/input/ogr/ogr_converter.cpp index 7388ff9d4..8892ef1f9 100644 --- a/plugins/input/ogr/ogr_converter.cpp +++ b/plugins/input/ogr/ogr_converter.cpp @@ -111,21 +111,21 @@ void ogr_converter::convert_polygon(OGRPolygon* geom, feature_ptr feature) std::auto_ptr poly(new geometry_type(mapnik::Polygon)); poly->move_to(exterior->getX(0), exterior->getY(0)); - for (int i = 1; i < num_points - 1; ++i) + for (int i = 1; i < num_points; ++i) { poly->line_to(exterior->getX(i), exterior->getY(i)); } - poly->close(exterior->getX(num_points-1), exterior->getY(num_points-1)); + poly->close_path(); for (int r = 0; r < num_interior; ++r) { 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 - 1; ++i) + for (int i = 1; i < num_points; ++i) { poly->line_to(interior->getX(i), interior->getY(i)); } - poly->close(interior->getX(num_points-1), interior->getY(num_points-1)); + poly->close_path(); } feature->paths().push_back(poly); } diff --git a/plugins/input/ogr/ogr_datasource.cpp b/plugins/input/ogr/ogr_datasource.cpp index d52ae60f4..dd8a62307 100644 --- a/plugins/input/ogr/ogr_datasource.cpp +++ b/plugins/input/ogr/ogr_datasource.cpp @@ -31,6 +31,7 @@ #include #include #include +#include // boost #include @@ -82,7 +83,7 @@ void ogr_datasource::init(mapnik::parameters const& params) // initialize ogr formats OGRRegisterAll(); - + boost::optional file = params.get("file"); boost::optional string = params.get("string"); if (! file && ! string) @@ -162,7 +163,7 @@ void ogr_datasource::init(mapnik::parameters const& params) } else if (layer_by_index) { - const unsigned num_layers = dataset_->GetLayerCount(); + int num_layers = dataset_->GetLayerCount(); if (*layer_by_index >= num_layers) { std::ostringstream s("OGR Plugin: only "); @@ -253,7 +254,12 @@ void ogr_datasource::init(mapnik::parameters const& params) } index_name_ = dataset_name_.substr(0, breakpoint) + ".ogrindex"; +#if defined (_WINDOWS) + std::ifstream index_file(mapnik::utf8_to_utf16(index_name_), std::ios::in | std::ios::binary); +#else std::ifstream index_file(index_name_.c_str(), std::ios::in | std::ios::binary); +#endif + if (index_file) { indexed_ = true; @@ -525,7 +531,7 @@ featureset_ptr ogr_datasource::features_at_point(coord2d const& pt, double tol) if (indexed_) { - filter_at_point filter(pt); + filter_at_point filter(pt, tol); return featureset_ptr(new ogr_index_featureset (ctx, *layer, @@ -535,13 +541,11 @@ featureset_ptr ogr_datasource::features_at_point(coord2d const& pt, double tol) } else { - OGRPoint point; - point.setX (pt.x); - point.setY (pt.y); - + mapnik::box2d bbox(pt, pt); + bbox.pad(tol); return featureset_ptr(new ogr_featureset (ctx, *layer, - point, + bbox, desc_.get_encoding())); } } diff --git a/plugins/input/ogr/ogr_index_featureset.cpp b/plugins/input/ogr/ogr_index_featureset.cpp index 4823b0a76..1f6c62939 100644 --- a/plugins/input/ogr/ogr_index_featureset.cpp +++ b/plugins/input/ogr/ogr_index_featureset.cpp @@ -59,10 +59,11 @@ ogr_index_featureset::ogr_index_featureset(mapnik::context_ptr const & layerdef_(layer.GetLayerDefn()), filter_(filter), tr_(new transcoder(encoding)), - fidcolumn_(layer_.GetFIDColumn()) + fidcolumn_(layer_.GetFIDColumn()), + feature_envelope_() { - boost::optional memory = mapnik::mapped_memory_cache::instance().find(index_file.c_str(),true); + boost::optional memory = mapnik::mapped_memory_cache::instance().find(index_file, true); if (memory) { boost::interprocess::ibufferstream file(static_cast((*memory)->get_address()),(*memory)->get_size()); @@ -104,6 +105,9 @@ feature_ptr ogr_index_featureset::next() OGRGeometry* geom=poFeature->GetGeometryRef(); if (geom && !geom->IsEmpty()) { + geom->getEnvelope(&feature_envelope_); + if (!filter_.pass(mapnik::box2d(feature_envelope_.MinX,feature_envelope_.MinY, + feature_envelope_.MaxX,feature_envelope_.MaxY))) continue; ogr_converter::convert_geometry (geom, feature); } else diff --git a/plugins/input/ogr/ogr_index_featureset.hpp b/plugins/input/ogr/ogr_index_featureset.hpp index 5e4c6cbc5..9972935e4 100644 --- a/plugins/input/ogr/ogr_index_featureset.hpp +++ b/plugins/input/ogr/ogr_index_featureset.hpp @@ -50,6 +50,7 @@ private: std::vector::iterator itr_; boost::scoped_ptr tr_; const char* fidcolumn_; + OGREnvelope feature_envelope_; }; #endif // OGR_INDEX_FEATURESET_HPP diff --git a/plugins/input/osm/build.py b/plugins/input/osm/build.py index 4cff88aea..ce24e041e 100644 --- a/plugins/input/osm/build.py +++ b/plugins/input/osm/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,38 +17,52 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'osm' plugin_env = plugin_base.Clone() -osm_src = Split( +plugin_sources = Split( """ + %(PLUGIN_NAME)s.cpp + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp osmparser.cpp - osm.cpp - osm_datasource.cpp - osm_featureset.cpp dataset_deliverer.cpp basiccurl.cpp - """ - ) + """ % locals() +) +# Link Library to Dependencies libraries = [ 'xml2' ] libraries.append('curl') -libraries.append('mapnik') libraries.append(env['ICU_LIB_NAME']) libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append('boost_filesystem%s' % env['BOOST_APPEND']) -input_plugin = plugin_env.SharedLibrary('../osm', source=osm_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/osm/dataset_deliverer.cpp b/plugins/input/osm/dataset_deliverer.cpp index 0b7e848af..994c104ee 100644 --- a/plugins/input/osm/dataset_deliverer.cpp +++ b/plugins/input/osm/dataset_deliverer.cpp @@ -23,9 +23,7 @@ // mapnik #include #include - -// boost -#include +#include // std #include @@ -42,7 +40,7 @@ osm_dataset* dataset_deliverer::load_from_file(const string& file, const string& // Only actually load from file if we haven't done so already if (dataset == NULL) { - if (!boost::filesystem::exists(file)) + if (!mapnik::util::exists(file)) { throw mapnik::datasource_exception("OSM Plugin: '" + file + "' does not exist"); } diff --git a/plugins/input/osm/osmparser.cpp b/plugins/input/osm/osmparser.cpp index 7238e026e..9a6fbc28f 100644 --- a/plugins/input/osm/osmparser.cpp +++ b/plugins/input/osm/osmparser.cpp @@ -4,13 +4,14 @@ #include "osm.h" #include #include +#include osm_item* osmparser::cur_item=NULL; mapnik::value_integer osmparser::curID=0; bool osmparser::in_node=false, osmparser::in_way=false; osm_dataset* osmparser::components=NULL; std::string osmparser::error=""; -std::map osmparser::tmp_node_store=std::map(); +std::map osmparser::tmp_node_store=std::map(); void osmparser::processNode(xmlTextReaderPtr reader) { @@ -48,7 +49,7 @@ void osmparser::startElement(xmlTextReaderPtr reader, const xmlChar *name) assert(xid); node->lat=atof((char*)xlat); node->lon=atof((char*)xlon); - node->id = atol((char*)xid); + mapnik::util::string2int((char *)xid, node->id); cur_item = node; tmp_node_store[node->id] = node; xmlFree(xid); @@ -62,7 +63,7 @@ void osmparser::startElement(xmlTextReaderPtr reader, const xmlChar *name) osm_way *way=new osm_way; xid=xmlTextReaderGetAttribute(reader,BAD_CAST "id"); assert(xid); - way->id = atol((char*)xid); + mapnik::util::string2int((char *)xid, way->id); cur_item = way; xmlFree(xid); } @@ -70,7 +71,8 @@ void osmparser::startElement(xmlTextReaderPtr reader, const xmlChar *name) { xid=xmlTextReaderGetAttribute(reader,BAD_CAST "ref"); assert(xid); - long ndid = atol((char*)xid); + mapnik::value_integer ndid; + mapnik::util::string2int((char *)xid, ndid); if(tmp_node_store.find(ndid)!=tmp_node_store.end()) { (static_cast(cur_item))->nodes.push_back diff --git a/plugins/input/osm/osmparser.h b/plugins/input/osm/osmparser.h index 4e8d0f3d3..9f2aeacd8 100644 --- a/plugins/input/osm/osmparser.h +++ b/plugins/input/osm/osmparser.h @@ -46,7 +46,7 @@ private: static bool in_node, in_way; static osm_dataset* components; static std::string error; - static std::map tmp_node_store; + static std::map tmp_node_store; static int do_parse(xmlTextReaderPtr); }; diff --git a/plugins/input/postgis/build.py b/plugins/input/postgis/build.py index 271de7caf..53a1d721d 100644 --- a/plugins/input/postgis/build.py +++ b/plugins/input/postgis/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,44 +17,59 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'postgis' plugin_env = plugin_base.Clone() -postgis_src = Split( +plugin_sources = Split( """ - postgis_datasource.cpp - postgis_featureset.cpp - """ - ) - -# clear out and rebuild libs -plugin_env['LIBS'] = ['pq'] + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + """ % locals() +) # Link Library to Dependencies -plugin_env['LIBS'].append('mapnik') -plugin_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND']) -plugin_env['LIBS'].append(env['ICU_LIB_NAME']) +libraries = ['pq'] +libraries.append('boost_system%s' % env['BOOST_APPEND']) +libraries.append(env['ICU_LIB_NAME']) + if env['THREADING'] == 'multi': - plugin_env['LIBS'].append('boost_thread%s' % env['BOOST_APPEND']) + libraries.append('boost_thread%s' % env['BOOST_APPEND']) if env['RUNTIME_LINK'] == 'static': - #cmd = 'pg_config --libs' - #plugin_env.ParseConfig(cmd) # pg_config does not seem to report correct deps of libpq - # so resort to hardcoding for now - plugin_env['LIBS'].extend(['ldap','pam','ssl','crypto','krb5']) + # on os x so resort to hardcoding for now + if env['PLATFORM'] == 'Darwin': + libraries.extend(['ldap', 'pam', 'ssl', 'crypto', 'krb5']) + else: + # TODO - parse back into libraries variable + plugin_env.ParseConfig('pg_config --libs') -input_plugin = plugin_env.SharedLibrary('../postgis', source=postgis_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LINKFLAGS=env['CUSTOM_LDFLAGS']) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/postgis/connection.hpp b/plugins/input/postgis/connection.hpp index 2f4bc5532..d8726aef0 100644 --- a/plugins/input/postgis/connection.hpp +++ b/plugins/input/postgis/connection.hpp @@ -143,7 +143,7 @@ public: bool isOK() const { - return (PQstatus(conn_) != CONNECTION_BAD); + return (!closed_) && (PQstatus(conn_) != CONNECTION_BAD); } void close() diff --git a/plugins/input/postgis/postgis_datasource.cpp b/plugins/input/postgis/postgis_datasource.cpp index b4d8176a9..67d51314b 100644 --- a/plugins/input/postgis/postgis_datasource.cpp +++ b/plugins/input/postgis/postgis_datasource.cpp @@ -36,7 +36,6 @@ // boost #include #include -#include #include // stl @@ -53,7 +52,6 @@ const std::string postgis_datasource::GEOMETRY_COLUMNS = "geometry_columns"; const std::string postgis_datasource::SPATIAL_REF_SYS = "spatial_ref_system"; using boost::shared_ptr; -using mapnik::PoolGuard; using mapnik::attribute_descriptor; postgis_datasource::postgis_datasource(parameters const& params) @@ -113,10 +111,10 @@ postgis_datasource::postgis_datasource(parameters const& params) if (pool) { shared_ptr conn = pool->borrowObject(); - if (conn && conn->isOK()) + if (!conn) return; + + if (conn->isOK()) { - PoolGuard, - shared_ptr< Pool > > guard(conn, pool); desc_.set_encoding(conn->client_encoding()); @@ -178,7 +176,8 @@ postgis_datasource::postgis_datasource(parameters const& params) if (srid_c != NULL) { int result = 0; - if (mapnik::util::string2int(srid_c, result)) + const char * end = srid_c + std::strlen(srid_c); + if (mapnik::util::string2int(srid_c, end, result)) { srid_ = result; } @@ -209,7 +208,8 @@ postgis_datasource::postgis_datasource(parameters const& params) if (srid_c != NULL) { int result = 0; - if (mapnik::util::string2int(srid_c, result)) + const char * end = srid_c + std::strlen(srid_c); + if (mapnik::util::string2int(srid_c, end, result)) { srid_ = result; } @@ -412,7 +412,7 @@ postgis_datasource::postgis_datasource(parameters const& params) rs->close(); - } + } } } @@ -598,8 +598,6 @@ featureset_ptr postgis_datasource::features(const query& q) const shared_ptr conn = pool->borrowObject(); if (conn && conn->isOK()) { - PoolGuard, shared_ptr< Pool > > guard(conn ,pool); - if (geometryColumn_.empty()) { std::ostringstream s_error; @@ -712,10 +710,10 @@ featureset_ptr postgis_datasource::features_at_point(coord2d const& pt, double t if (pool) { shared_ptr conn = pool->borrowObject(); - if (conn && conn->isOK()) - { - PoolGuard, shared_ptr< Pool > > guard(conn, pool); + if (!conn) return featureset_ptr(); + if (conn->isOK()) + { if (geometryColumn_.empty()) { std::ostringstream s_error; @@ -798,10 +796,9 @@ boost::optional > postgis_datasource::envelope() const if (pool) { shared_ptr conn = pool->borrowObject(); - if (conn && conn->isOK()) + if (!conn) return extent_; + if (conn->isOK()) { - PoolGuard, shared_ptr< Pool > > guard(conn, pool); - std::ostringstream s; if (geometryColumn_.empty()) { @@ -885,10 +882,9 @@ boost::optional postgis_datasource::get_geometry if (pool) { shared_ptr conn = pool->borrowObject(); - if (conn && conn->isOK()) + if (!conn) return result; + if (conn->isOK()) { - PoolGuard, shared_ptr< Pool > > guard(conn, pool); - std::ostringstream s; std::string g_type; try diff --git a/plugins/input/postgis/postgis_featureset.cpp b/plugins/input/postgis/postgis_featureset.cpp index b8c146dad..d23c8edba 100644 --- a/plugins/input/postgis/postgis_featureset.cpp +++ b/plugins/input/postgis/postgis_featureset.cpp @@ -75,10 +75,17 @@ feature_ptr postgis_featureset::next() if (key_field_) { + std::string name = rs_->getFieldName(pos); + + // null feature id is not acceptable + if (rs_->isNull(pos)) + { + MAPNIK_LOG_WARN(postgis) << "postgis_featureset: null value encountered for key_field: " << name; + continue; + } // create feature with user driven id from attribute int oid = rs_->getTypeOID(pos); const char* buf = rs_->getValue(pos); - std::string name = rs_->getFieldName(pos); // validation happens of this type at initialization mapnik::value_integer val; @@ -110,24 +117,29 @@ feature_ptr postgis_featureset::next() ++feature_id_; } + // null geometry is not acceptable + if (rs_->isNull(0)) + { + MAPNIK_LOG_WARN(postgis) << "postgis_featureset: null value encountered for geometry"; + continue; + } + // parse geometry int size = rs_->getFieldLength(0); const char *data = rs_->getValue(0); + if (!geometry_utils::from_wkb(feature->paths(), data, size)) continue; totalGeomSize_ += size; - unsigned num_attrs = ctx_->size() + 1; for (; pos < num_attrs; ++pos) { std::string name = rs_->getFieldName(pos); - if (rs_->isNull(pos)) - { - feature->put(name, mapnik::value_null()); - } - else + // NOTE: we intentionally do not store null here + // since it is equivalent to the attribute not existing + if (!rs_->isNull(pos)) { const char* buf = rs_->getValue(pos); const int oid = rs_->getTypeOID(pos); @@ -201,7 +213,7 @@ feature_ptr postgis_featureset::next() default: { - MAPNIK_LOG_WARN(postgis) << "postgis_featureset: Uknown type_oid=" << oid; + MAPNIK_LOG_WARN(postgis) << "postgis_featureset: Unknown type_oid=" << oid; break; } diff --git a/plugins/input/python/build.py b/plugins/input/python/build.py index d946cf6cd..bf5313eb4 100644 --- a/plugins/input/python/build.py +++ b/plugins/input/python/build.py @@ -1,13 +1,29 @@ -#!/usr/bin/env python +# +# 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 - -PLUGIN_NAME = 'python' - Import ('plugin_base') Import ('env') -install_dest = env['MAPNIK_INPUT_PLUGINS_DEST'] +PLUGIN_NAME = 'python' plugin_env = plugin_base.Clone() @@ -17,64 +33,68 @@ plugin_sources = Split( %(PLUGIN_NAME)s_featureset.cpp %(PLUGIN_NAME)s_utils.cpp """ % locals() - ) +) -boost_system = 'boost_system%s' % env['BOOST_APPEND'] -libraries = ['mapnik',env['BOOST_PYTHON_LIB'],boost_system,env['ICU_LIB_NAME']] +# 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 = 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 -python_link_flag = '-lpython%s' % env['PYTHON_VERSION'] - -if env['PLATFORM'] == 'Darwin': - if env['PYTHON_DYNAMIC_LOOKUP']: - python_link_flag = '-undefined dynamic_lookup' - elif env['FRAMEWORK_PYTHON']: - if env['FRAMEWORK_SEARCH_PATH']: - python_link_flag = '-F%s -framework Python -Z' % env['FRAMEWORK_SEARCH_PATH'] +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: - 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' + 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']) if env['CUSTOM_LDFLAGS']: linkflags = '%s %s' % (env['CUSTOM_LDFLAGS'], python_link_flag) else: linkflags = python_link_flag -plugin_env.Append(CPPPATH = env['PYTHON_INCLUDES']) - -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, - # any custom linkflags, eg. LDFLAGS - # in this case CUSTOM_LDFLAGS comes - # from Mapnik's main SConstruct file - # and can be removed here if you do - # not need it - LINKFLAGS=linkflags - ) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + CPPPATH=allcpp_paths, + LIBS=libraries, + LINKFLAGS=linkflags) -# if the plugin links to libmapnik ensure it is built first -Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + # 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) + # 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': linkflags.replace('-Z','').split(' '), +} + +Return('plugin_obj') diff --git a/plugins/input/python/python_datasource.cpp b/plugins/input/python/python_datasource.cpp index 3c8795503..45a461b7c 100644 --- a/plugins/input/python/python_datasource.cpp +++ b/plugins/input/python/python_datasource.cpp @@ -122,15 +122,43 @@ mapnik::datasource::datasource_t python_datasource::type() const mapnik::box2d python_datasource::envelope() const { + mapnik::box2d box; try { ensure_gil lock; - return boost::python::extract >(datasource_.attr("envelope")); + 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 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 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 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 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 python_datasource::get_geometry_type() const diff --git a/plugins/input/raster/build.py b/plugins/input/raster/build.py index 2a3c7dd41..dd6f8d76d 100644 --- a/plugins/input/raster/build.py +++ b/plugins/input/raster/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,35 +17,48 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'raster' plugin_env = plugin_base.Clone() -raster_src = Split( +plugin_sources = Split( """ - raster_datasource.cpp - raster_featureset.cpp - raster_info.cpp - """ - ) + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + %(PLUGIN_NAME)s_info.cpp + """ % locals() +) -libraries = [] # Link Library to Dependencies -libraries.append('mapnik') +libraries = [] libraries.append(env['ICU_LIB_NAME']) libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append('boost_filesystem%s' % env['BOOST_APPEND']) -input_plugin = plugin_env.SharedLibrary('../raster', source=raster_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/raster/raster_datasource.cpp b/plugins/input/raster/raster_datasource.cpp index 110211251..5c1779836 100644 --- a/plugins/input/raster/raster_datasource.cpp +++ b/plugins/input/raster/raster_datasource.cpp @@ -21,12 +21,13 @@ *****************************************************************************/ // boost -#include #include // mapnik +#include #include #include +#include #include #include @@ -46,9 +47,9 @@ using mapnik::image_reader; DATASOURCE_PLUGIN(raster_datasource) raster_datasource::raster_datasource(parameters const& params) - : datasource(params), - desc_(*params.get("type"), "utf-8"), - extent_initialized_(false) +: datasource(params), + desc_(*params.get("type"), "utf-8"), + extent_initialized_(false) { MAPNIK_LOG_DEBUG(raster) << "raster_datasource: Initializing..."; @@ -65,15 +66,16 @@ raster_datasource::raster_datasource(parameters const& params) tile_size_ = *params.get("tile_size", 256); tile_stride_ = *params.get("tile_stride", 1); - format_ = *params.get("format","tiff"); + boost::optional format_from_filename = mapnik::type_from_filename(*file); + format_ = *params.get("format",format_from_filename?(*format_from_filename) : "tiff"); boost::optional lox = params.get("lox"); boost::optional loy = params.get("loy"); boost::optional hix = params.get("hix"); boost::optional hiy = params.get("hiy"); - + boost::optional ext = params.get("extent"); - + if (lox && loy && hix && hiy) { extent_.init(*lox, *loy, *hix, *hiy); @@ -88,7 +90,7 @@ raster_datasource::raster_datasource(parameters const& params) { throw datasource_exception("Raster Plugin: valid or are required"); } - + if (multi_tiles_) { boost::optional x_width = params.get("x_width"); @@ -109,7 +111,7 @@ raster_datasource::raster_datasource(parameters const& params) } else { - if (! boost::filesystem::exists(filename_)) + if (!mapnik::util::exists(filename_)) { throw datasource_exception("Raster Plugin: " + filename_ + " does not exist"); } @@ -189,7 +191,7 @@ featureset_ptr raster_datasource::features(query const& q) const return boost::make_shared >(policy, extent_, q); } - else if (width * height > (tile_size_ * tile_size_ << 2)) + else if (width * height > static_cast(tile_size_ * tile_size_ << 2)) { MAPNIK_LOG_DEBUG(raster) << "raster_datasource: Tiled policy"; diff --git a/plugins/input/raster/raster_featureset.cpp b/plugins/input/raster/raster_featureset.cpp index 729052df5..6a337cfd8 100644 --- a/plugins/input/raster/raster_featureset.cpp +++ b/plugins/input/raster/raster_featureset.cpp @@ -32,6 +32,7 @@ // boost #include #include +#include #include "raster_featureset.hpp" diff --git a/plugins/input/raster/raster_featureset.hpp b/plugins/input/raster/raster_featureset.hpp index 5085d3199..5d3c620a3 100644 --- a/plugins/input/raster/raster_featureset.hpp +++ b/plugins/input/raster/raster_featureset.hpp @@ -35,7 +35,6 @@ // boost #include -#include class single_file_policy { @@ -127,8 +126,8 @@ public: tiled_file_policy(std::string const& file, std::string const& format, unsigned tile_size, - box2d extent, - box2d bbox, + box2d const& extent, + box2d const& bbox, unsigned width, unsigned height) { diff --git a/plugins/input/raster/raster_info.cpp b/plugins/input/raster/raster_info.cpp index 941dffd06..10bd79775 100644 --- a/plugins/input/raster/raster_info.cpp +++ b/plugins/input/raster/raster_info.cpp @@ -44,13 +44,13 @@ raster_info::raster_info(const raster_info& rhs) { } -void raster_info::swap(raster_info& other) throw() +void raster_info::swap(raster_info& other) //throw() { - file_ = other.file_; - format_ = other.format_; - extent_ = other.extent_; - width_ = other.width_; - height_ = other.height_; + std::swap(file_,other.file_); + std::swap(format_,other.format_); + std::swap(extent_ ,other.extent_); + std::swap(width_,other.width_); + std::swap(height_, other.height_); } diff --git a/plugins/input/raster/raster_info.hpp b/plugins/input/raster/raster_info.hpp index e3756d544..4de948528 100644 --- a/plugins/input/raster/raster_info.hpp +++ b/plugins/input/raster/raster_info.hpp @@ -47,7 +47,7 @@ public: inline unsigned height() const { return height_;} private: - void swap(raster_info& other) throw(); + void swap(raster_info& other); std::string file_; std::string format_; diff --git a/plugins/input/rasterlite/build.py b/plugins/input/rasterlite/build.py index cee50da27..a3140120b 100644 --- a/plugins/input/rasterlite/build.py +++ b/plugins/input/rasterlite/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,35 +17,47 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'rasterlite' plugin_env = plugin_base.Clone() -rasterlite_src = Split( +plugin_sources = Split( """ - rasterlite_datasource.cpp - rasterlite_featureset.cpp - """ - ) - -libraries = [env['PLUGINS']['rasterlite']['lib']] + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + """ % locals() +) # Link Library to Dependencies -libraries.append('mapnik') +libraries = [env['PLUGINS']['rasterlite']['lib']] libraries.append(env['ICU_LIB_NAME']) libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append('boost_filesystem%s' % env['BOOST_APPEND']) -input_plugin = plugin_env.SharedLibrary('../rasterlite', source=rasterlite_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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/rasterlite/rasterlite_datasource.cpp b/plugins/input/rasterlite/rasterlite_datasource.cpp index 893fb7f45..7b9d67861 100644 --- a/plugins/input/rasterlite/rasterlite_datasource.cpp +++ b/plugins/input/rasterlite/rasterlite_datasource.cpp @@ -24,10 +24,10 @@ #include "rasterlite_featureset.hpp" // boost -#include #include // mapnik +#include #include #include #include @@ -91,12 +91,7 @@ rasterlite_datasource::rasterlite_datasource(parameters const& params) else dataset_name_ = *file; - this->init(params); -} - -void rasterlite_datasource::init(mapnik::parameters const& params) -{ - if (!boost::filesystem::exists(dataset_name_)) throw datasource_exception(dataset_name_ + " does not exist"); + if (!mapnik::util::exists(dataset_name_)) throw datasource_exception(dataset_name_ + " does not exist"); void *dataset = open_dataset(); diff --git a/plugins/input/rasterlite/rasterlite_featureset.cpp b/plugins/input/rasterlite/rasterlite_featureset.cpp index 93327764e..7eb7a0ee7 100644 --- a/plugins/input/rasterlite/rasterlite_featureset.cpp +++ b/plugins/input/rasterlite/rasterlite_featureset.cpp @@ -24,7 +24,10 @@ // mapnik #include +#include #include +#include +#include #include #include @@ -32,7 +35,6 @@ #include -using mapnik::query; using mapnik::coord2d; using mapnik::box2d; using mapnik::feature_ptr; @@ -127,7 +129,8 @@ feature_ptr rasterlite_featureset::get_feature(mapnik::query const& q) { if (size > 0) { - mapnik::image_data_32 image(width, height); + mapnik::raster_ptr rasterp = boost::make_shared(intersect, width, height); + mapnik::image_data_32 & image = rasterp->data_; image.set(0xffffffff); unsigned char* raster_data = static_cast(raster); @@ -135,7 +138,7 @@ feature_ptr rasterlite_featureset::get_feature(mapnik::query const& q) memcpy (image_data, raster_data, size); - feature->set_raster(boost::make_shared(intersect,image)); + feature->set_raster(rasterp); free (raster); diff --git a/plugins/input/rasterlite/rasterlite_featureset.hpp b/plugins/input/rasterlite/rasterlite_featureset.hpp index ce6677582..4f58b7220 100644 --- a/plugins/input/rasterlite/rasterlite_featureset.hpp +++ b/plugins/input/rasterlite/rasterlite_featureset.hpp @@ -25,6 +25,8 @@ // mapnik #include +#include +#include // boost #include diff --git a/plugins/input/shape/build.py b/plugins/input/shape/build.py index 5a1e0d89a..3d07be202 100644 --- a/plugins/input/shape/build.py +++ b/plugins/input/shape/build.py @@ -1,7 +1,7 @@ - +# # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,50 +17,69 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'shape' plugin_env = plugin_base.Clone() -shape_src = Split( +plugin_sources = Split( """ - dbfile.cpp - shape_datasource.cpp - shape_featureset.cpp - shape_index_featureset.cpp - shape_io.cpp - shape_utils.cpp - """ - ) - -libraries = [] + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + %(PLUGIN_NAME)s_index_featureset.cpp + %(PLUGIN_NAME)s_io.cpp + %(PLUGIN_NAME)s_utils.cpp + dbfile.cpp + """ % locals() +) # Link Library to Dependencies -libraries.append('mapnik') +libraries = [] libraries.append(env['ICU_LIB_NAME']) libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append('boost_filesystem%s' % env['BOOST_APPEND']) + +cppdefines = [] +cxxflags = [] if env['SHAPE_MEMORY_MAPPED_FILE']: - plugin_env.Append(CXXFLAGS = '-DSHAPE_MEMORY_MAPPED_FILE') + cppdefines.append('-DSHAPE_MEMORY_MAPPED_FILE') 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 < 46: # avoid ubuntu issue with boost interprocess: # https://github.com/mapnik/mapnik/issues/1082 - plugin_env.Append(CXXFLAGS = '-fpermissive') + cxxflags.append('-fpermissive') -input_plugin = plugin_env.SharedLibrary('../shape', SHLIBSUFFIX='.input', source=shape_src, SHLIBPREFIX='', LIBS = libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) +plugin_env.Append(CXXFLAGS=cxxflags) +plugin_env.Append(CPPDEFINES=cppdefines) -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + TARGET = plugin_env.SharedLibrary('../shape', + SHLIBSUFFIX='.input', + SHLIBPREFIX='', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=env['CUSTOM_LDFLAGS']) + + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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, + 'CXXFLAGS': cxxflags, + 'CPPDEFINES': cppdefines, +} + +Return('plugin_obj') diff --git a/plugins/input/shape/dbfile.cpp b/plugins/input/shape/dbfile.cpp index feb6ba8ea..2c34c76ff 100644 --- a/plugins/input/shape/dbfile.cpp +++ b/plugins/input/shape/dbfile.cpp @@ -35,6 +35,7 @@ // stl #include +#include using mapnik::mapped_memory_cache; @@ -50,6 +51,8 @@ dbf_file::dbf_file(std::string const& file_name) record_length_(0), #ifdef SHAPE_MEMORY_MAPPED_FILE file_(), +#elif defined(_WINDOWS) + file_(mapnik::utf8_to_utf16(file_name), std::ios::in | std::ios::binary), #else file_(file_name.c_str() ,std::ios::in | std::ios::binary), #endif @@ -57,11 +60,16 @@ dbf_file::dbf_file(std::string const& file_name) { #ifdef SHAPE_MEMORY_MAPPED_FILE - boost::optional memory = mapped_memory_cache::instance().find(file_name.c_str(),true); + boost::optional memory = mapped_memory_cache::instance().find(file_name,true); if (memory) { + mapped_region_ = *memory; file_.buffer(static_cast((*memory)->get_address()),(*memory)->get_size()); } + else + { + throw std::runtime_error("could not create file mapping for "+file_name); + } #endif if (file_) { @@ -162,7 +170,8 @@ void dbf_file::add_attribute(int col, mapnik::transcoder const& tr, mapnik::feat { if (record_[fields_[col].offset_] == '*') { - f.put(name,mapnik::value_null()); + // NOTE: we intentionally do not store null here + // since it is equivalent to the attribute not existing break; } if ( fields_[col].dec_>0 ) diff --git a/plugins/input/shape/dbfile.hpp b/plugins/input/shape/dbfile.hpp index b4a0a9bbe..3659c1cb8 100644 --- a/plugins/input/shape/dbfile.hpp +++ b/plugins/input/shape/dbfile.hpp @@ -27,6 +27,7 @@ #include #include #include +#include // boost #include @@ -57,6 +58,7 @@ private: std::vector fields_; #ifdef SHAPE_MEMORY_MAPPED_FILE boost::interprocess::ibufferstream file_; + mapnik::mapped_region_ptr mapped_region_; #else std::ifstream file_; #endif diff --git a/plugins/input/shape/shape_datasource.cpp b/plugins/input/shape/shape_datasource.cpp index 5b6d4cfeb..88b855c02 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) 2011 Artem Pavlenko + * 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 @@ -28,12 +28,13 @@ #include #include #include -#include #include // mapnik #include +#include #include +#include #include #include #include @@ -76,23 +77,19 @@ shape_datasource::shape_datasource(const parameters ¶ms) shape_name_ = *file; boost::algorithm::ireplace_last(shape_name_,".shp",""); - - if (!boost::filesystem::exists(shape_name_ + ".shp")) + if (!mapnik::util::exists(shape_name_ + ".shp")) { throw datasource_exception("Shape Plugin: shapefile '" + shape_name_ + ".shp' does not exist"); } - - if (boost::filesystem::is_directory(shape_name_ + ".shp")) + if (mapnik::util::is_directory(shape_name_ + ".shp")) { throw datasource_exception("Shape Plugin: shapefile '" + shape_name_ + ".shp' appears to be a directory not a file"); } - - if (!boost::filesystem::exists(shape_name_ + ".dbf")) + if (!mapnik::util::exists(shape_name_ + ".dbf")) { throw datasource_exception("Shape Plugin: shapefile '" + shape_name_ + ".dbf' does not exist"); } - try { #ifdef MAPNIK_STATS @@ -205,22 +202,7 @@ void shape_datasource::init(shape_io& shape) #endif // check if we have an index file around - indexed_ = shape.has_index(); - - //std::string index_name(shape_name_+".index"); - //std::ifstream file(index_name.c_str(),std::ios::in | std::ios::binary); - //if (file) - //{ - // indexed_=true; - // file.close(); - //} - //else - //{ - // MAPNIK_LOG_DEBUG(shape) << "shape_datasource: No .index file found for " - // << shape_name_ << ".shp, use the 'shapeindex' program to build an index for faster rendering"; - //} - MAPNIK_LOG_DEBUG(shape) << "shape_datasource: Extent=" << extent_; MAPNIK_LOG_DEBUG(shape) << "shape_datasource: File length=" << file_length_; MAPNIK_LOG_DEBUG(shape) << "shape_datasource: Shape type=" << shape_type_; diff --git a/plugins/input/shape/shape_index_featureset.cpp b/plugins/input/shape/shape_index_featureset.cpp index 78836a030..20d4bd181 100644 --- a/plugins/input/shape/shape_index_featureset.cpp +++ b/plugins/input/shape/shape_index_featureset.cpp @@ -144,7 +144,7 @@ feature_ptr shape_index_featureset::next() return feature_ptr(); } - // FIXME + // FIXME: https://github.com/mapnik/mapnik/issues/1020 feature->set_id(shape_.id_); if (attr_ids_.size()) { diff --git a/plugins/input/shape/shape_io.cpp b/plugins/input/shape/shape_io.cpp index 12d481fad..bbeb14276 100644 --- a/plugins/input/shape/shape_io.cpp +++ b/plugins/input/shape/shape_io.cpp @@ -27,7 +27,6 @@ #include // boost -#include #include using mapnik::datasource_exception; @@ -175,24 +174,13 @@ void shape_io::read_polygon(shape_file::record_type & record, mapnik::geometry_c double x = record.read_double(); double y = record.read_double(); poly->move_to(x, y); - double start_x = x; - double start_y = y; - for (int j=start+1;jline_to(x, y); } - x = record.read_double(); - y = record.read_double(); - if (x == start_x && y == start_y) - { - poly->close(x, y); - } - else - { - poly->line_to(x, y); - } + poly->close_path(); geom.push_back(poly); } } diff --git a/plugins/input/shape/shapefile.hpp b/plugins/input/shape/shapefile.hpp index d4f6e97d9..a07630410 100644 --- a/plugins/input/shape/shapefile.hpp +++ b/plugins/input/shape/shapefile.hpp @@ -26,9 +26,12 @@ // stl #include #include +#include + // mapnik #include +#include #include #include #include @@ -137,6 +140,7 @@ public: #ifdef SHAPE_MEMORY_MAPPED_FILE typedef ibufferstream file_source_type; typedef shape_record record_type; + mapnik::mapped_region_ptr mapped_region_; #else typedef std::ifstream file_source_type; typedef shape_record record_type; @@ -149,17 +153,24 @@ public: shape_file(std::string const& file_name) : #ifdef SHAPE_MEMORY_MAPPED_FILE file_() +#elif defined (_WINDOWS) + file_(mapnik::utf8_to_utf16(file_name), std::ios::in | std::ios::binary) #else file_(file_name.c_str(), std::ios::in | std::ios::binary) #endif { #ifdef SHAPE_MEMORY_MAPPED_FILE boost::optional memory = - mapnik::mapped_memory_cache::instance().find(file_name.c_str(),true); + mapnik::mapped_memory_cache::instance().find(file_name,true); if (memory) { - file_.buffer(static_cast((*memory)->get_address()), (*memory)->get_size()); + mapped_region_ = *memory; + file_.buffer(static_cast((*memory)->get_address()),(*memory)->get_size()); + } + else + { + throw std::runtime_error("could not create file mapping for "+file_name); } #endif } diff --git a/plugins/input/sqlite/build.py b/plugins/input/sqlite/build.py index 458a885ad..5930a2ed7 100644 --- a/plugins/input/sqlite/build.py +++ b/plugins/input/sqlite/build.py @@ -1,7 +1,7 @@ # # This file is part of Mapnik (c++ mapping toolkit) # -# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon +# 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 @@ -17,39 +17,53 @@ # 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 ('plugin_base') Import ('env') -prefix = env['PREFIX'] +PLUGIN_NAME = 'sqlite' plugin_env = plugin_base.Clone() -sqlite_src = Split( +plugin_sources = Split( """ - sqlite_datasource.cpp - sqlite_featureset.cpp - """ - ) - -libraries = [ 'sqlite3' ] + %(PLUGIN_NAME)s_datasource.cpp + %(PLUGIN_NAME)s_featureset.cpp + """ % locals() +) # Link Library to Dependencies -libraries.append('mapnik') +libraries = [ 'sqlite3' ] libraries.append(env['ICU_LIB_NAME']) libraries.append('boost_system%s' % env['BOOST_APPEND']) -libraries.append('boost_filesystem%s' % env['BOOST_APPEND']) -linkflags = env['CUSTOM_LDFLAGS'] +linkflags = [] if env['SQLITE_LINKFLAGS']: linkflags.append(env['SQLITE_LINKFLAGS']) -input_plugin = plugin_env.SharedLibrary('../sqlite', source=sqlite_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=linkflags) +if env['PLUGIN_LINKING'] == 'shared': + libraries.append('mapnik') + linkflags.append(env['CUSTOM_LDFLAGS']) -# if the plugin links to libmapnik ensure it is built first -Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME, + SHLIBPREFIX='', + SHLIBSUFFIX='.input', + source=plugin_sources, + LIBS=libraries, + LINKFLAGS=(' ').join(linkflags)) -if 'uninstall' not in COMMAND_LINE_TARGETS: - env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin) - env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST']) + # if the plugin links to libmapnik ensure it is built first + Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME'])) + + 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, + 'LINKFLAGS': linkflags, +} + +Return('plugin_obj') diff --git a/plugins/input/sqlite/sqlite_connection.hpp b/plugins/input/sqlite/sqlite_connection.hpp index 7518f816b..54908434b 100644 --- a/plugins/input/sqlite/sqlite_connection.hpp +++ b/plugins/input/sqlite/sqlite_connection.hpp @@ -62,7 +62,6 @@ public: #endif const int rc = sqlite3_open_v2 (file_.c_str(), &db_, mode, 0); #else -#warning "Mapnik's sqlite plugin is compiling against a version of sqlite older than 3.5.x which may make rendering slow..." const int rc = sqlite3_open (file_.c_str(), &db_); #endif if (rc != SQLITE_OK) @@ -83,7 +82,6 @@ public: #if SQLITE_VERSION_NUMBER >= 3005000 const int rc = sqlite3_open_v2 (file_.c_str(), &db_, flags, 0); #else -#warning "Mapnik's sqlite plugin is compiling against a version of sqlite older than 3.5.x which may make rendering slow..." const int rc = sqlite3_open (file_.c_str(), &db_); #endif if (rc != SQLITE_OK) diff --git a/plugins/input/sqlite/sqlite_datasource.cpp b/plugins/input/sqlite/sqlite_datasource.cpp index cc84dd3d7..f8e6e8da1 100644 --- a/plugins/input/sqlite/sqlite_datasource.cpp +++ b/plugins/input/sqlite/sqlite_datasource.cpp @@ -33,13 +33,12 @@ #include #include #include +#include // boost #include #include -#include #include -#include using mapnik::box2d; using mapnik::coord2d; @@ -90,7 +89,7 @@ sqlite_datasource::sqlite_datasource(parameters const& params) else dataset_name_ = *file; - if ((dataset_name_.compare(":memory:") != 0) && (!boost::filesystem::exists(dataset_name_))) + if ((dataset_name_.compare(":memory:") != 0) && (!mapnik::util::exists(dataset_name_))) { throw datasource_exception("Sqlite Plugin: " + dataset_name_ + " does not exist"); } @@ -280,7 +279,7 @@ sqlite_datasource::sqlite_datasource(parameters const& params) mapnik::progress_timer __stats2__(std::clog, "sqlite_datasource::init(use_spatial_index)"); #endif - if (boost::filesystem::exists(index_db)) + if (mapnik::util::exists(index_db)) { dataset_->execute("attach database '" + index_db + "' as " + index_table_); } @@ -297,28 +296,16 @@ sqlite_datasource::sqlite_datasource(parameters const& params) << " FROM (" << geometry_table_ << ")"; - /* - std::vector rtree_list; - { - boost::shared_ptr rs = dataset_->execute_query(query.str()); - sqlite_utils::build_tree(rs,rtree_list); - } - if (sqlite_utils::create_spatial_index2(index_db,index_table_,rtree_list)) - { - //extent_initialized_ = true; - has_spatial_index_ = true; - if (boost::filesystem::exists(index_db)) - { - dataset_->execute("attach database '" + index_db + "' as " + index_table_); - } - } - */ +#ifdef MAPNIK_STATS + mapnik::progress_timer __stats2__(std::clog, "sqlite_datasource::init(create_spatial_index)"); +#endif + boost::shared_ptr rs = dataset_->execute_query(query.str()); if (sqlite_utils::create_spatial_index(index_db,index_table_,rs)) { //extent_initialized_ = true; has_spatial_index_ = true; - if (boost::filesystem::exists(index_db)) + if (mapnik::util::exists(index_db)) { dataset_->execute("attach database '" + index_db + "' as " + index_table_); } @@ -340,6 +327,9 @@ sqlite_datasource::sqlite_datasource(parameters const& params) if (! extent_initialized_) { +#ifdef MAPNIK_STATS + mapnik::progress_timer __stats2__(std::clog, "sqlite_datasource::init(detect_extent)"); +#endif // TODO - clean this up - reducing arguments std::string query = populate_tokens(table_); if (!sqlite_utils::detect_extent(dataset_, @@ -379,38 +369,6 @@ sqlite_datasource::~sqlite_datasource() { } -#if (BOOST_FILESYSTEM_VERSION <= 2) -namespace boost { -namespace filesystem { -path read_symlink(const path& p) -{ - path symlink_path; - -#ifdef BOOST_POSIX_API - for (std::size_t path_max = 64;; path_max *= 2)// loop 'til buffer is large enough - { - boost::scoped_array buf(new char[path_max]); - ssize_t result; - if ((result=::readlink(p.string().c_str(), buf.get(), path_max))== -1) - { - throw std::runtime_error("could not read symlink"); - } - else - { - if(result != static_cast(path_max)) - { - symlink_path.assign(buf.get(), buf.get() + result); - break; - } - } - } -#endif - return symlink_path; -} -} -} -#endif - void sqlite_datasource::parse_attachdb(std::string const& attachdb) const { boost::char_separator sep(","); @@ -432,29 +390,10 @@ void sqlite_datasource::parse_attachdb(std::string const& attachdb) const // Break out the dbname and the filename std::string dbname = mapnik::util::trim_copy(spec.substr(0, atpos)); std::string filename = mapnik::util::trim_copy(spec.substr(atpos + 1)); - // Normalize the filename and make it relative to dataset_name_ - if (filename.compare(":memory:") != 0) + if (filename.compare(":memory:") != 0 && mapnik::util::is_relative(filename)) { - boost::filesystem::path child_path(filename); - - // It is a relative path. Fix it. - if (! child_path.has_root_directory() && ! child_path.has_root_name()) - { - boost::filesystem::path absolute_path(dataset_name_); - - // support symlinks - if (boost::filesystem::is_symlink(absolute_path)) - { - absolute_path = boost::filesystem::read_symlink(absolute_path); - } - -#if (BOOST_FILESYSTEM_VERSION == 3) - filename = boost::filesystem::absolute(absolute_path.parent_path() / filename).string(); -#else - filename = boost::filesystem::complete(absolute_path.branch_path() / filename).normalize().string(); -#endif - } + filename = mapnik::util::make_relative(filename,dataset_name_); } // And add an init_statement_ @@ -619,9 +558,8 @@ featureset_ptr sqlite_datasource::features_at_point(coord2d const& pt, double to if (dataset_) { - // TODO - need tolerance - mapnik::box2d const e(pt.x, pt.y, pt.x, pt.y); - + mapnik::box2d e(pt.x, pt.y, pt.x, pt.y); + e.pad(tol); std::ostringstream s; mapnik::context_ptr ctx = boost::make_shared(); diff --git a/plugins/input/sqlite/sqlite_datasource.hpp b/plugins/input/sqlite/sqlite_datasource.hpp index 37241fbab..516d632f6 100644 --- a/plugins/input/sqlite/sqlite_datasource.hpp +++ b/plugins/input/sqlite/sqlite_datasource.hpp @@ -37,7 +37,6 @@ // boost #include #include -#include // stl #include diff --git a/plugins/input/sqlite/sqlite_featureset.cpp b/plugins/input/sqlite/sqlite_featureset.cpp index e5860b677..2f1735e47 100644 --- a/plugins/input/sqlite/sqlite_featureset.cpp +++ b/plugins/input/sqlite/sqlite_featureset.cpp @@ -71,6 +71,13 @@ feature_ptr sqlite_featureset::next() return feature_ptr(); } + // null feature id is not acceptable + if (rs_->column_type(1) == SQLITE_NULL) + { + MAPNIK_LOG_ERROR(postgis) << "sqlite_featureset: null value encountered for key_field"; + continue; + } + feature_ptr feature = feature_factory::create(ctx_,rs_->column_integer64(1)); if (!geometry_utils::from_wkb(feature->paths(), data, size, format_)) continue; @@ -123,7 +130,8 @@ feature_ptr sqlite_featureset::next() case SQLITE_NULL: { - feature->put(fld_name_str, mapnik::value_null()); + // NOTE: we intentionally do not store null here + // since it is equivalent to the attribute not existing break; } diff --git a/plugins/input/sqlite/sqlite_prepared.hpp b/plugins/input/sqlite/sqlite_prepared.hpp index 477759f5d..f10ad7288 100644 --- a/plugins/input/sqlite/sqlite_prepared.hpp +++ b/plugins/input/sqlite/sqlite_prepared.hpp @@ -24,6 +24,7 @@ #define MAPNIK_SQLITE_PREPARED_HPP // mapnik +#include #include #include #include @@ -77,11 +78,13 @@ public: { if (*(*ds_)) { - std::cerr << "ERR:" << sqlite3_errmsg(*(*ds_)) << "\n"; + MAPNIK_LOG_ERROR(sqlite) << "~prepared_index_statement:" + << sqlite3_errmsg(*(*ds_)); } else { - std::cerr << "SQLite Plugin: " << res << "\n"; + MAPNIK_LOG_ERROR(sqlite) << "~prepared_index_statement:" + << res; } } } diff --git a/plugins/input/sqlite/sqlite_resultset.hpp b/plugins/input/sqlite/sqlite_resultset.hpp index 9c10eb0f3..e8e6a16fe 100644 --- a/plugins/input/sqlite/sqlite_resultset.hpp +++ b/plugins/input/sqlite/sqlite_resultset.hpp @@ -24,6 +24,7 @@ #define MAPNIK_SQLITE_RESULTSET_HPP // mapnik +#include #include #include @@ -125,7 +126,7 @@ public: return (const char*) sqlite3_column_text (stmt_, col); } - const void* column_blob (int col, int& bytes) + const char* column_blob (int col, int& bytes) { bytes = sqlite3_column_bytes (stmt_, col); return (const char*) sqlite3_column_blob (stmt_, col); diff --git a/plugins/input/sqlite/sqlite_utils.hpp b/plugins/input/sqlite/sqlite_utils.hpp index 6caee666c..b3cc4c025 100644 --- a/plugins/input/sqlite/sqlite_utils.hpp +++ b/plugins/input/sqlite/sqlite_utils.hpp @@ -29,17 +29,18 @@ #include // mapnik +#include +#include #include #include #include #include - +#include // boost #include #include #include -#include // sqlite extern "C" { @@ -234,7 +235,7 @@ public: int flags; #endif - bool existed = boost::filesystem::exists(index_db); + bool existed = mapnik::util::exists(index_db); boost::shared_ptr ds = boost::make_shared(index_db,flags); bool one_success = false; @@ -327,8 +328,8 @@ public: { try { - boost::filesystem::remove(index_db); - } + mapnik::util::remove(index_db); + } catch (...) {}; } throw mapnik::datasource_exception(ex.what()); @@ -343,7 +344,7 @@ public: { try { - boost::filesystem::remove(index_db); + mapnik::util::remove(index_db); } catch (...) {}; } @@ -412,7 +413,8 @@ public: int flags; #endif - bool existed = boost::filesystem::exists(index_db); + bool existed = mapnik::util::exists(index_db);; + boost::shared_ptr ds = boost::make_shared(index_db,flags); bool one_success = false; @@ -459,7 +461,7 @@ public: { try { - boost::filesystem::remove(index_db); + mapnik::util::remove(index_db); } catch (...) {}; } @@ -475,7 +477,7 @@ public: { try { - boost::filesystem::remove(index_db); + mapnik::util::remove(index_db); } catch (...) {}; } @@ -498,6 +500,7 @@ public: std::ostringstream s; s << "SELECT xmin, ymin, xmax, ymax FROM " << metadata; s << " WHERE LOWER(f_table_name) = LOWER('" << geometry_table << "')"; + MAPNIK_LOG_DEBUG(sqlite) << "sqlite_datasource: executing: '" << s.str() << "'"; boost::shared_ptr rs(ds->execute_query(s.str())); if (rs->is_valid() && rs->step_next()) { @@ -514,7 +517,7 @@ public: std::ostringstream s; s << "SELECT MIN(xmin), MIN(ymin), MAX(xmax), MAX(ymax) FROM " << index_table; - + MAPNIK_LOG_DEBUG(sqlite) << "sqlite_datasource: executing: '" << s.str() << "'"; boost::shared_ptr rs(ds->execute_query(s.str())); if (rs->is_valid() && rs->step_next()) { @@ -535,6 +538,7 @@ public: std::ostringstream s; s << "SELECT " << geometry_field << "," << key_field << " FROM (" << table << ")"; + MAPNIK_LOG_DEBUG(sqlite) << "sqlite_datasource: executing: '" << s.str() << "'"; boost::shared_ptr rs(ds->execute_query(s.str())); sqlite_utils::query_extent(rs,extent); return true; @@ -556,7 +560,7 @@ public: } catch (std::exception const& ex) { - //std::clog << "no: " << ex.what() << "\n"; + MAPNIK_LOG_DEBUG(sqlite) << "has_rtree returned:" << ex.what(); return false; } return false; @@ -609,9 +613,7 @@ public: break; default: -#ifdef MAPNIK_DEBUG - std::clog << "Sqlite Plugin: unknown type_oid=" << type_oid << std::endl; -#endif + MAPNIK_LOG_DEBUG(sqlite) << "detect_types_from_subquery: unknown type_oid=" << type_oid; break; } } @@ -691,20 +693,22 @@ public: desc.add_descriptor(mapnik::attribute_descriptor(fld_name, mapnik::String)); } } -#ifdef MAPNIK_DEBUG else { // "Column Affinity" says default to "Numeric" but for now we pass.. //desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double)); - // TODO - this should not fail when we specify geometry_field in XML file - - std::clog << "Sqlite Plugin: column '" - << std::string(fld_name) - << "' unhandled due to unknown type: " - << fld_type << std::endl; - } +#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; + } #endif + } } } diff --git a/plugins/input/templates/helloworld/build.py b/plugins/input/templates/helloworld/build.py index 5a974dd4b..d90efa26e 100644 --- a/plugins/input/templates/helloworld/build.py +++ b/plugins/input/templates/helloworld/build.py @@ -11,21 +11,17 @@ import os -# Give this plugin a name -# here this happens to be the same as the directory -PLUGIN_NAME = 'hello' - # 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 -# 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'] - # clone the environment here # so that if we modify the env it in this file # those changes to not pollute other builds later on... @@ -35,7 +31,7 @@ plugin_env = plugin_base.Clone() plugin_sources = Split( """ %(PLUGIN_NAME)s_datasource.cpp - %(PLUGIN_NAME)s_featureset.cpp + %(PLUGIN_NAME)s_featureset.cpp """ % locals() ) @@ -43,37 +39,54 @@ plugin_sources = Split( # directly link to libraries = [ '' ] # eg 'libfoo' -libraries.append('mapnik') 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']) - -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, - # any custom linkflags, eg. LDFLAGS - # in this case CUSTOM_LDFLAGS comes - # from Mapnik's main SConstruct file - # and can be removed here if you do - # not need it - LINKFLAGS=env.get('CUSTOM_LDFLAGS') - ) -# if the plugin links to libmapnik ensure it is built first -Depends(TARGET, env.subst('../../../../src/%s' % env['MAPNIK_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'] -# 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) + # only link mapnik if we are build an external shared object + libraries.append('mapnik') + + 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, + # any custom linkflags, eg. LDFLAGS + # in this case CUSTOM_LDFLAGS comes + # from Mapnik's main SConstruct file + # and can be removed here if you do + # not need it + LINKFLAGS=env.get('CUSTOM_LDFLAGS') + ) + + # 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/run_tests b/run_tests index 329c8e70d..ccb045123 100755 --- a/run_tests +++ b/run_tests @@ -8,10 +8,12 @@ failures=$((failures+$?)) echo "*** Running C++ tests..." for FILE in tests/cpp_tests/*-bin; do - ${FILE}; + ${FILE} -q -d .; failures=$((failures+$?)) done +echo + echo "*** Running python tests..." python tests/run_tests.py -q failures=$((failures+$?)) diff --git a/scons/scons-LICENSE b/scons/scons-LICENSE index 4df86d1d4..d47d178b8 100644 --- a/scons/scons-LICENSE +++ b/scons/scons-LICENSE @@ -3,7 +3,7 @@ This copyright and license do not apply to any other software with which this software may have been included. -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/scons/scons-README b/scons/scons-README index f1d59d4b4..dc2d7dba7 100644 --- a/scons/scons-README +++ b/scons/scons-README @@ -1,4 +1,4 @@ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation SCons - a software construction tool @@ -202,3 +202,4 @@ With plenty of help from the SCons Development team: Anthony Roach Terrel Shumway + diff --git a/scons/scons-local-2.2.0/SCons/Action.py b/scons/scons-local-2.3.0/SCons/Action.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Action.py rename to scons/scons-local-2.3.0/SCons/Action.py index a648c6937..0021df6e7 100644 --- a/scons/scons-local-2.2.0/SCons/Action.py +++ b/scons/scons-local-2.3.0/SCons/Action.py @@ -76,7 +76,7 @@ way for wrapping up the functions. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -97,7 +97,7 @@ way for wrapping up the functions. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Action.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Action.py 2013/03/03 09:48:35 garyo" import SCons.compat diff --git a/scons/scons-local-2.2.0/SCons/Builder.py b/scons/scons-local-2.3.0/SCons/Builder.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Builder.py rename to scons/scons-local-2.3.0/SCons/Builder.py index 5a8aff1aa..2c9958f85 100644 --- a/scons/scons-local-2.2.0/SCons/Builder.py +++ b/scons/scons-local-2.3.0/SCons/Builder.py @@ -76,7 +76,7 @@ There are the following methods for internal use within this module: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -97,7 +97,7 @@ There are the following methods for internal use within this module: # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Builder.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Builder.py 2013/03/03 09:48:35 garyo" import collections diff --git a/scons/scons-local-2.2.0/SCons/CacheDir.py b/scons/scons-local-2.3.0/SCons/CacheDir.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/CacheDir.py rename to scons/scons-local-2.3.0/SCons/CacheDir.py index ec7e9eebf..aef03b4b4 100644 --- a/scons/scons-local-2.2.0/SCons/CacheDir.py +++ b/scons/scons-local-2.3.0/SCons/CacheDir.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/CacheDir.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/CacheDir.py 2013/03/03 09:48:35 garyo" __doc__ = """ CacheDir support diff --git a/scons/scons-local-2.2.0/SCons/Conftest.py b/scons/scons-local-2.3.0/SCons/Conftest.py similarity index 100% rename from scons/scons-local-2.2.0/SCons/Conftest.py rename to scons/scons-local-2.3.0/SCons/Conftest.py diff --git a/scons/scons-local-2.2.0/SCons/Debug.py b/scons/scons-local-2.3.0/SCons/Debug.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Debug.py rename to scons/scons-local-2.3.0/SCons/Debug.py index 5f1b87c13..41b0ab6ee 100644 --- a/scons/scons-local-2.2.0/SCons/Debug.py +++ b/scons/scons-local-2.3.0/SCons/Debug.py @@ -6,7 +6,7 @@ needed by most users. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -28,7 +28,7 @@ needed by most users. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Debug.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Debug.py 2013/03/03 09:48:35 garyo" import os import sys diff --git a/scons/scons-local-2.2.0/SCons/Defaults.py b/scons/scons-local-2.3.0/SCons/Defaults.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Defaults.py rename to scons/scons-local-2.3.0/SCons/Defaults.py index 96760cedc..219190a9e 100644 --- a/scons/scons-local-2.2.0/SCons/Defaults.py +++ b/scons/scons-local-2.3.0/SCons/Defaults.py @@ -10,7 +10,7 @@ from distutils.msvccompiler. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -33,7 +33,7 @@ from distutils.msvccompiler. # from __future__ import division -__revision__ = "src/engine/SCons/Defaults.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Defaults.py 2013/03/03 09:48:35 garyo" import os diff --git a/scons/scons-local-2.2.0/SCons/Environment.py b/scons/scons-local-2.3.0/SCons/Environment.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Environment.py rename to scons/scons-local-2.3.0/SCons/Environment.py index addf782a3..833f3ccb9 100644 --- a/scons/scons-local-2.2.0/SCons/Environment.py +++ b/scons/scons-local-2.3.0/SCons/Environment.py @@ -10,7 +10,7 @@ Environment """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ Environment # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Environment.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Environment.py 2013/03/03 09:48:35 garyo" import copy @@ -2247,6 +2247,7 @@ class Base(SubstitutionEnvironment): install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES) return install._UNIQUE_INSTALLED_FILES + class OverrideEnvironment(Base): """A proxy that overrides variables in a wrapped construction environment by returning values from an overrides dictionary in diff --git a/scons/scons-local-2.2.0/SCons/Errors.py b/scons/scons-local-2.3.0/SCons/Errors.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Errors.py rename to scons/scons-local-2.3.0/SCons/Errors.py index 8541c68ab..41dac1957 100644 --- a/scons/scons-local-2.2.0/SCons/Errors.py +++ b/scons/scons-local-2.3.0/SCons/Errors.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -28,7 +28,7 @@ and user errors in SCons. """ -__revision__ = "src/engine/SCons/Errors.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Errors.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Executor.py b/scons/scons-local-2.3.0/SCons/Executor.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Executor.py rename to scons/scons-local-2.3.0/SCons/Executor.py index 9ea6e631d..0bea6fb69 100644 --- a/scons/scons-local-2.2.0/SCons/Executor.py +++ b/scons/scons-local-2.3.0/SCons/Executor.py @@ -6,7 +6,7 @@ Nodes. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Nodes. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Executor.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Executor.py 2013/03/03 09:48:35 garyo" import collections diff --git a/scons/scons-local-2.2.0/SCons/Job.py b/scons/scons-local-2.3.0/SCons/Job.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Job.py rename to scons/scons-local-2.3.0/SCons/Job.py index 342f55e98..4e51b993a 100644 --- a/scons/scons-local-2.2.0/SCons/Job.py +++ b/scons/scons-local-2.3.0/SCons/Job.py @@ -7,7 +7,7 @@ stop, and wait on jobs. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ stop, and wait on jobs. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Job.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Job.py 2013/03/03 09:48:35 garyo" import SCons.compat diff --git a/scons/scons-local-2.2.0/SCons/Memoize.py b/scons/scons-local-2.3.0/SCons/Memoize.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Memoize.py rename to scons/scons-local-2.3.0/SCons/Memoize.py index 9850a841f..af84745e1 100644 --- a/scons/scons-local-2.2.0/SCons/Memoize.py +++ b/scons/scons-local-2.3.0/SCons/Memoize.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Memoize.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Memoize.py 2013/03/03 09:48:35 garyo" __doc__ = """Memoizer diff --git a/scons/scons-local-2.2.0/SCons/Node/Alias.py b/scons/scons-local-2.3.0/SCons/Node/Alias.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Node/Alias.py rename to scons/scons-local-2.3.0/SCons/Node/Alias.py index fbef1fdd1..02fe12120 100644 --- a/scons/scons-local-2.2.0/SCons/Node/Alias.py +++ b/scons/scons-local-2.3.0/SCons/Node/Alias.py @@ -8,7 +8,7 @@ This creates a hash of global Aliases (dummy targets). """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ This creates a hash of global Aliases (dummy targets). # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Node/Alias.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Node/Alias.py 2013/03/03 09:48:35 garyo" import collections diff --git a/scons/scons-local-2.2.0/SCons/Node/FS.py b/scons/scons-local-2.3.0/SCons/Node/FS.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Node/FS.py rename to scons/scons-local-2.3.0/SCons/Node/FS.py index 3f3cf2870..a21561f2e 100644 --- a/scons/scons-local-2.2.0/SCons/Node/FS.py +++ b/scons/scons-local-2.3.0/SCons/Node/FS.py @@ -11,7 +11,7 @@ that can be used by scripts or modules looking for the canonical default. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ that can be used by scripts or modules looking for the canonical default. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Node/FS.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Node/FS.py 2013/03/03 09:48:35 garyo" import fnmatch import os diff --git a/scons/scons-local-2.2.0/SCons/Node/Python.py b/scons/scons-local-2.3.0/SCons/Node/Python.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Node/Python.py rename to scons/scons-local-2.3.0/SCons/Node/Python.py index 5c302e6f7..153e32d0b 100644 --- a/scons/scons-local-2.2.0/SCons/Node/Python.py +++ b/scons/scons-local-2.3.0/SCons/Node/Python.py @@ -5,7 +5,7 @@ Python nodes. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Python nodes. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Node/Python.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Node/Python.py 2013/03/03 09:48:35 garyo" import SCons.Node diff --git a/scons/scons-local-2.2.0/SCons/Node/__init__.py b/scons/scons-local-2.3.0/SCons/Node/__init__.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Node/__init__.py rename to scons/scons-local-2.3.0/SCons/Node/__init__.py index 126d83c09..ece4a5a44 100644 --- a/scons/scons-local-2.2.0/SCons/Node/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Node/__init__.py @@ -20,7 +20,7 @@ be able to depend on any other type of "thing." """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -41,7 +41,7 @@ be able to depend on any other type of "thing." # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Node/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Node/__init__.py 2013/03/03 09:48:35 garyo" import collections import copy diff --git a/scons/scons-local-2.2.0/SCons/Options/BoolOption.py b/scons/scons-local-2.3.0/SCons/Options/BoolOption.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Options/BoolOption.py rename to scons/scons-local-2.3.0/SCons/Options/BoolOption.py index be2de6ce7..f1569a552 100644 --- a/scons/scons-local-2.2.0/SCons/Options/BoolOption.py +++ b/scons/scons-local-2.3.0/SCons/Options/BoolOption.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Options/BoolOption.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Options/BoolOption.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/Options/EnumOption.py b/scons/scons-local-2.3.0/SCons/Options/EnumOption.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Options/EnumOption.py rename to scons/scons-local-2.3.0/SCons/Options/EnumOption.py index b7aa8530e..9207e718a 100644 --- a/scons/scons-local-2.2.0/SCons/Options/EnumOption.py +++ b/scons/scons-local-2.3.0/SCons/Options/EnumOption.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Options/EnumOption.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Options/EnumOption.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/Options/ListOption.py b/scons/scons-local-2.3.0/SCons/Options/ListOption.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Options/ListOption.py rename to scons/scons-local-2.3.0/SCons/Options/ListOption.py index ba4c4a98a..cbf0bd98c 100644 --- a/scons/scons-local-2.2.0/SCons/Options/ListOption.py +++ b/scons/scons-local-2.3.0/SCons/Options/ListOption.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Options/ListOption.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Options/ListOption.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/Options/PackageOption.py b/scons/scons-local-2.3.0/SCons/Options/PackageOption.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Options/PackageOption.py rename to scons/scons-local-2.3.0/SCons/Options/PackageOption.py index d65564077..2b27931d5 100644 --- a/scons/scons-local-2.2.0/SCons/Options/PackageOption.py +++ b/scons/scons-local-2.3.0/SCons/Options/PackageOption.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Options/PackageOption.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Options/PackageOption.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/Options/PathOption.py b/scons/scons-local-2.3.0/SCons/Options/PathOption.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Options/PathOption.py rename to scons/scons-local-2.3.0/SCons/Options/PathOption.py index e7de97f89..56475adb2 100644 --- a/scons/scons-local-2.2.0/SCons/Options/PathOption.py +++ b/scons/scons-local-2.3.0/SCons/Options/PathOption.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Options/PathOption.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Options/PathOption.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/Options/__init__.py b/scons/scons-local-2.3.0/SCons/Options/__init__.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Options/__init__.py rename to scons/scons-local-2.3.0/SCons/Options/__init__.py index 62edfa900..0004b8f8f 100644 --- a/scons/scons-local-2.2.0/SCons/Options/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Options/__init__.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Options/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Options/__init__.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/PathList.py b/scons/scons-local-2.3.0/SCons/PathList.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/PathList.py rename to scons/scons-local-2.3.0/SCons/PathList.py index 9a4145331..1129d1ed1 100644 --- a/scons/scons-local-2.2.0/SCons/PathList.py +++ b/scons/scons-local-2.3.0/SCons/PathList.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/PathList.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/PathList.py 2013/03/03 09:48:35 garyo" __doc__ = """SCons.PathList @@ -131,12 +131,14 @@ class _PathList(object): value = env.subst(value, target=target, source=source, conv=node_conv) if SCons.Util.is_Sequence(value): - result.extend(value) - continue - + result.extend(SCons.Util.flatten(value)) + elif value: + result.append(value) elif type == TYPE_OBJECT: value = node_conv(value) - if value: + if value: + result.append(value) + elif value: result.append(value) return tuple(result) diff --git a/scons/scons-local-2.2.0/SCons/Platform/__init__.py b/scons/scons-local-2.3.0/SCons/Platform/__init__.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Platform/__init__.py rename to scons/scons-local-2.3.0/SCons/Platform/__init__.py index 2cab3c865..5a1d43741 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Platform/__init__.py @@ -20,7 +20,7 @@ their own platform definition. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -42,7 +42,7 @@ their own platform definition. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/__init__.py 2013/03/03 09:48:35 garyo" import SCons.compat diff --git a/scons/scons-local-2.2.0/SCons/Platform/aix.py b/scons/scons-local-2.3.0/SCons/Platform/aix.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Platform/aix.py rename to scons/scons-local-2.3.0/SCons/Platform/aix.py index df3ee4044..70dce56be 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/aix.py +++ b/scons/scons-local-2.3.0/SCons/Platform/aix.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/aix.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/aix.py 2013/03/03 09:48:35 garyo" import os diff --git a/scons/scons-local-2.2.0/SCons/Platform/cygwin.py b/scons/scons-local-2.3.0/SCons/Platform/cygwin.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Platform/cygwin.py rename to scons/scons-local-2.3.0/SCons/Platform/cygwin.py index 31d822b96..92efdf638 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/cygwin.py +++ b/scons/scons-local-2.3.0/SCons/Platform/cygwin.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/cygwin.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/cygwin.py 2013/03/03 09:48:35 garyo" import posix from SCons.Platform import TempFileMunge diff --git a/scons/scons-local-2.2.0/SCons/Platform/darwin.py b/scons/scons-local-2.3.0/SCons/Platform/darwin.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Platform/darwin.py rename to scons/scons-local-2.3.0/SCons/Platform/darwin.py index 907ec45d1..f1ba6be93 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/darwin.py +++ b/scons/scons-local-2.3.0/SCons/Platform/darwin.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/darwin.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/darwin.py 2013/03/03 09:48:35 garyo" import posix import os diff --git a/scons/scons-local-2.2.0/SCons/Platform/hpux.py b/scons/scons-local-2.3.0/SCons/Platform/hpux.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/Platform/hpux.py rename to scons/scons-local-2.3.0/SCons/Platform/hpux.py index 2312439a8..232baf43a 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/hpux.py +++ b/scons/scons-local-2.3.0/SCons/Platform/hpux.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/hpux.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/hpux.py 2013/03/03 09:48:35 garyo" import posix diff --git a/scons/scons-local-2.2.0/SCons/Platform/irix.py b/scons/scons-local-2.3.0/SCons/Platform/irix.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/Platform/irix.py rename to scons/scons-local-2.3.0/SCons/Platform/irix.py index f0b089a86..f4bc6f8ce 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/irix.py +++ b/scons/scons-local-2.3.0/SCons/Platform/irix.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/irix.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/irix.py 2013/03/03 09:48:35 garyo" import posix diff --git a/scons/scons-local-2.2.0/SCons/Platform/os2.py b/scons/scons-local-2.3.0/SCons/Platform/os2.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Platform/os2.py rename to scons/scons-local-2.3.0/SCons/Platform/os2.py index 0576abdd6..1409711e9 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/os2.py +++ b/scons/scons-local-2.3.0/SCons/Platform/os2.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/os2.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/os2.py 2013/03/03 09:48:35 garyo" import win32 def generate(env): diff --git a/scons/scons-local-2.2.0/SCons/Platform/posix.py b/scons/scons-local-2.3.0/SCons/Platform/posix.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Platform/posix.py rename to scons/scons-local-2.3.0/SCons/Platform/posix.py index cff1f93a4..38b2a8def 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/posix.py +++ b/scons/scons-local-2.3.0/SCons/Platform/posix.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/posix.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/posix.py 2013/03/03 09:48:35 garyo" import errno import os diff --git a/scons/scons-local-2.2.0/SCons/Platform/sunos.py b/scons/scons-local-2.3.0/SCons/Platform/sunos.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Platform/sunos.py rename to scons/scons-local-2.3.0/SCons/Platform/sunos.py index 7ae60f840..23e876c52 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/sunos.py +++ b/scons/scons-local-2.3.0/SCons/Platform/sunos.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/sunos.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/sunos.py 2013/03/03 09:48:35 garyo" import posix diff --git a/scons/scons-local-2.2.0/SCons/Platform/win32.py b/scons/scons-local-2.3.0/SCons/Platform/win32.py similarity index 89% rename from scons/scons-local-2.2.0/SCons/Platform/win32.py rename to scons/scons-local-2.3.0/SCons/Platform/win32.py index 2d6d970d3..3def1f834 100644 --- a/scons/scons-local-2.2.0/SCons/Platform/win32.py +++ b/scons/scons-local-2.3.0/SCons/Platform/win32.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Platform/win32.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Platform/win32.py 2013/03/03 09:48:35 garyo" import os import os.path @@ -81,8 +81,39 @@ else: builtins.file = _scons_file builtins.open = _scons_open - - +try: + import threading + spawn_lock = threading.Lock() + + # This locked version of spawnve works around a Windows + # MSVCRT bug, because its spawnve is not thread-safe. + # Without this, python can randomly crash while using -jN. + # See the python bug at http://bugs.python.org/issue6476 + # and SCons issue at + # http://scons.tigris.org/issues/show_bug.cgi?id=2449 + def spawnve(mode, file, args, env): + spawn_lock.acquire() + try: + if mode == os.P_WAIT: + ret = os.spawnve(os.P_NOWAIT, file, args, env) + else: + ret = os.spawnve(mode, file, args, env) + finally: + spawn_lock.release() + if mode == os.P_WAIT: + pid, status = os.waitpid(ret, 0) + ret = status >> 8 + return ret +except ImportError: + # Use the unsafe method of spawnve. + # Please, don't try to optimize this try-except block + # away by assuming that the threading module is always present. + # In the test test/option-j.py we intentionally call SCons with + # a fake threading.py that raises an import exception right away, + # simulating a non-existent package. + def spawnve(mode, file, args, env): + return os.spawnve(mode, file, args, env) + # The upshot of all this is that, if you are using Python 1.5.2, # you had better have cmd or command.com in your PATH when you run # scons. @@ -123,7 +154,7 @@ def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): # actually do the spawn try: args = [sh, '/C', escape(' '.join(args)) ] - ret = os.spawnve(os.P_WAIT, sh, args, env) + ret = spawnve(os.P_WAIT, sh, args, env) except OSError, e: # catch any error try: @@ -151,7 +182,7 @@ def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): def exec_spawn(l, env): try: - result = os.spawnve(os.P_WAIT, l[0], l, env) + result = spawnve(os.P_WAIT, l[0], l, env) except OSError, e: try: result = exitvalmap[e[0]] diff --git a/scons/scons-local-2.2.0/SCons/SConf.py b/scons/scons-local-2.3.0/SCons/SConf.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/SConf.py rename to scons/scons-local-2.3.0/SCons/SConf.py index 5c99db9d3..ae51776b6 100644 --- a/scons/scons-local-2.2.0/SCons/SConf.py +++ b/scons/scons-local-2.3.0/SCons/SConf.py @@ -4,7 +4,7 @@ Autoconf-like configuration support. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ Autoconf-like configuration support. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/SConf.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/SConf.py 2013/03/03 09:48:35 garyo" import SCons.compat diff --git a/scons/scons-local-2.2.0/SCons/SConsign.py b/scons/scons-local-2.3.0/SCons/SConsign.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/SConsign.py rename to scons/scons-local-2.3.0/SCons/SConsign.py index aa59836b9..a11f4e480 100644 --- a/scons/scons-local-2.2.0/SCons/SConsign.py +++ b/scons/scons-local-2.3.0/SCons/SConsign.py @@ -5,7 +5,7 @@ Writing and reading information to the .sconsign file or files. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Writing and reading information to the .sconsign file or files. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/SConsign.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/SConsign.py 2013/03/03 09:48:35 garyo" import SCons.compat diff --git a/scons/scons-local-2.2.0/SCons/Scanner/C.py b/scons/scons-local-2.3.0/SCons/Scanner/C.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Scanner/C.py rename to scons/scons-local-2.3.0/SCons/Scanner/C.py index 6ba7eeac1..0b664a008 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/C.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/C.py @@ -5,7 +5,7 @@ This module implements the depenency scanner for C/C++ code. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ This module implements the depenency scanner for C/C++ code. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/C.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/C.py 2013/03/03 09:48:35 garyo" import SCons.Node.FS import SCons.Scanner diff --git a/scons/scons-local-2.2.0/SCons/Scanner/D.py b/scons/scons-local-2.3.0/SCons/Scanner/D.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Scanner/D.py rename to scons/scons-local-2.3.0/SCons/Scanner/D.py index 20ab5f0ac..18b530f3a 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/D.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/D.py @@ -8,7 +8,7 @@ Coded by Andy Friesen """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ Coded by Andy Friesen # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/D.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/D.py 2013/03/03 09:48:35 garyo" import re diff --git a/scons/scons-local-2.2.0/SCons/Scanner/Dir.py b/scons/scons-local-2.3.0/SCons/Scanner/Dir.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Scanner/Dir.py rename to scons/scons-local-2.3.0/SCons/Scanner/Dir.py index 7c199bcf3..f508a6fe0 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/Dir.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/Dir.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -20,7 +20,7 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Scanner/Dir.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/Dir.py 2013/03/03 09:48:35 garyo" import SCons.Node.FS import SCons.Scanner diff --git a/scons/scons-local-2.2.0/SCons/Scanner/Fortran.py b/scons/scons-local-2.3.0/SCons/Scanner/Fortran.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Scanner/Fortran.py rename to scons/scons-local-2.3.0/SCons/Scanner/Fortran.py index 4bb49cd78..390e95172 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/Fortran.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/Fortran.py @@ -5,7 +5,7 @@ This module implements the dependency scanner for Fortran code. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ This module implements the dependency scanner for Fortran code. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Scanner/Fortran.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/Fortran.py 2013/03/03 09:48:35 garyo" import re diff --git a/scons/scons-local-2.2.0/SCons/Scanner/IDL.py b/scons/scons-local-2.3.0/SCons/Scanner/IDL.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Scanner/IDL.py rename to scons/scons-local-2.3.0/SCons/Scanner/IDL.py index d43e0139d..13a0226b9 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/IDL.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/IDL.py @@ -6,7 +6,7 @@ Definition Language) files. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -28,7 +28,7 @@ Definition Language) files. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/IDL.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/IDL.py 2013/03/03 09:48:35 garyo" import SCons.Node.FS import SCons.Scanner diff --git a/scons/scons-local-2.2.0/SCons/Scanner/LaTeX.py b/scons/scons-local-2.3.0/SCons/Scanner/LaTeX.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Scanner/LaTeX.py rename to scons/scons-local-2.3.0/SCons/Scanner/LaTeX.py index 4152fa2ae..c61688bc3 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/LaTeX.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/LaTeX.py @@ -5,7 +5,7 @@ This module implements the dependency scanner for LaTeX code. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ This module implements the dependency scanner for LaTeX code. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/LaTeX.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/LaTeX.py 2013/03/03 09:48:35 garyo" import os.path import re diff --git a/scons/scons-local-2.2.0/SCons/Scanner/Prog.py b/scons/scons-local-2.3.0/SCons/Scanner/Prog.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Scanner/Prog.py rename to scons/scons-local-2.3.0/SCons/Scanner/Prog.py index fbdf8581e..d7e19d36d 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/Prog.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/Prog.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/Prog.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/Prog.py 2013/03/03 09:48:35 garyo" import SCons.Node import SCons.Node.FS diff --git a/scons/scons-local-2.2.0/SCons/Scanner/RC.py b/scons/scons-local-2.3.0/SCons/Scanner/RC.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Scanner/RC.py rename to scons/scons-local-2.3.0/SCons/Scanner/RC.py index 871fdf9a0..3fa3e6757 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/RC.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/RC.py @@ -6,7 +6,7 @@ Definition Language) files. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -28,7 +28,7 @@ Definition Language) files. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/RC.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/RC.py 2013/03/03 09:48:35 garyo" import SCons.Node.FS import SCons.Scanner diff --git a/scons/scons-local-2.2.0/SCons/Scanner/__init__.py b/scons/scons-local-2.3.0/SCons/Scanner/__init__.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Scanner/__init__.py rename to scons/scons-local-2.3.0/SCons/Scanner/__init__.py index 9675e8dd5..b7b3197a4 100644 --- a/scons/scons-local-2.2.0/SCons/Scanner/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Scanner/__init__.py @@ -5,7 +5,7 @@ The Scanner package for the SCons software construction utility. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ The Scanner package for the SCons software construction utility. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Scanner/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Scanner/__init__.py 2013/03/03 09:48:35 garyo" import re diff --git a/scons/scons-local-2.2.0/SCons/Script/Interactive.py b/scons/scons-local-2.3.0/SCons/Script/Interactive.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Script/Interactive.py rename to scons/scons-local-2.3.0/SCons/Script/Interactive.py index e0822a7e3..b9a2e1e7c 100644 --- a/scons/scons-local-2.2.0/SCons/Script/Interactive.py +++ b/scons/scons-local-2.3.0/SCons/Script/Interactive.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -20,7 +20,7 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Script/Interactive.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Script/Interactive.py 2013/03/03 09:48:35 garyo" __doc__ = """ SCons interactive mode diff --git a/scons/scons-local-2.2.0/SCons/Script/Main.py b/scons/scons-local-2.3.0/SCons/Script/Main.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Script/Main.py rename to scons/scons-local-2.3.0/SCons/Script/Main.py index 12d1bc256..3f1b407aa 100644 --- a/scons/scons-local-2.2.0/SCons/Script/Main.py +++ b/scons/scons-local-2.3.0/SCons/Script/Main.py @@ -11,9 +11,9 @@ it goes here. """ unsupported_python_version = (2, 3, 0) -deprecated_python_version = (2, 4, 0) +deprecated_python_version = (2, 7, 0) -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -34,7 +34,7 @@ deprecated_python_version = (2, 4, 0) # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Script/Main.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Script/Main.py 2013/03/03 09:48:35 garyo" import SCons.compat @@ -187,7 +187,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask): finish_time = time.time() last_command_end = finish_time cumulative_command_time = cumulative_command_time+finish_time-start_time - sys.stdout.write("Command execution time: %f seconds\n"%(finish_time-start_time)) + sys.stdout.write("Command execution time: %s: %f seconds\n"%(str(self.node), finish_time-start_time)) def do_failed(self, status=2): _BuildFailures.append(self.exception[1]) @@ -203,7 +203,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask): SCons.Taskmaster.OutOfDateTask.fail_stop(self) exit_status = status this_build_status = status - + def executed(self): t = self.targets[0] if self.top and not t.has_builder() and not t.side_effect: @@ -248,7 +248,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask): except ValueError: t, e = exc_info tb = None - + # Deprecated string exceptions will have their string stored # in the first entry of the tuple. if e is None: @@ -266,9 +266,9 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask): errfmt = "scons: *** [%s] %s\n" sys.stderr.write(errfmt % (nodename, buildError)) - if (buildError.exc_info[2] and buildError.exc_info[1] and + if (buildError.exc_info[2] and buildError.exc_info[1] and not isinstance( - buildError.exc_info[1], + buildError.exc_info[1], (EnvironmentError, SCons.Errors.StopError, SCons.Errors.UserError))): type, value, trace = buildError.exc_info @@ -546,7 +546,7 @@ def find_deepest_user_frame(tb): Input is a "pre-processed" stack trace in the form returned by traceback.extract_tb() or traceback.extract_stack() """ - + tb.reverse() # find the deepest traceback frame that is not part @@ -559,7 +559,7 @@ def find_deepest_user_frame(tb): def _scons_user_error(e): """Handle user errors. Print out a message and a description of the - error, along with the line number and routine where it occured. + error, along with the line number and routine where it occured. The file and line number will be the deepest stack frame that is not part of SCons itself. """ @@ -677,7 +677,7 @@ def _load_site_scons_dir(topdir, site_dir_name=None): else: site_dir_name = "site_scons" err_if_not_found = False - + site_dir = os.path.join(topdir, site_dir_name) if not os.path.exists(site_dir): if err_if_not_found: @@ -934,7 +934,7 @@ def _main(parser): _load_site_scons_dir(d.path, options.site_dir) elif not options.no_site_dir: _load_all_site_scons_dirs(d.path) - + if options.include_dir: sys.path = options.include_dir + sys.path @@ -1009,10 +1009,11 @@ def _main(parser): # warning about deprecated Python versions--delayed until here # in case they disabled the warning in the SConscript files. if python_version_deprecated(): - msg = "Support for pre-2.4 Python (%s) is deprecated.\n" + \ + msg = "Support for pre-%s Python version (%s) is deprecated.\n" + \ " If this will cause hardship, contact dev@scons.tigris.org." + deprecated_version_string = ".".join(map(str, deprecated_python_version)) SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning, - msg % python_version_string()) + msg % (deprecated_version_string, python_version_string())) if not options.help: SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment()) @@ -1133,7 +1134,7 @@ def _build_targets(fs, options, targets, target_top): # x doesn't have a cwd, so it's either not a target, # or not a file, so go ahead and keep it as a default # target and let the engine sort it out: - return 1 + return 1 d = list(filter(check_dir, SCons.Script.DEFAULT_TARGETS)) SCons.Script.DEFAULT_TARGETS[:] = d target_top = None @@ -1327,10 +1328,10 @@ def main(): except (ImportError, AttributeError): # On Windows there is no scons.py, so there is no # __main__.__version__, hence there is no script version. - pass + pass parts.append(version_string("engine", SCons)) parts.append(path_string("engine", SCons)) - parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation") + parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation") version = ''.join(parts) import SConsOptions @@ -1338,7 +1339,7 @@ def main(): values = SConsOptions.SConsValues(parser.get_default_values()) OptionsParser = parser - + try: _exec_main(parser, values) except SystemExit, s: diff --git a/scons/scons-local-2.2.0/SCons/Script/SConsOptions.py b/scons/scons-local-2.3.0/SCons/Script/SConsOptions.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Script/SConsOptions.py rename to scons/scons-local-2.3.0/SCons/Script/SConsOptions.py index 1d574f8cb..6a6bae3e7 100644 --- a/scons/scons-local-2.2.0/SCons/Script/SConsOptions.py +++ b/scons/scons-local-2.3.0/SCons/Script/SConsOptions.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Script/SConsOptions.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Script/SConsOptions.py 2013/03/03 09:48:35 garyo" import optparse import re @@ -268,8 +268,9 @@ class SConsOptionParser(optparse.OptionParser): preserve_unknown_options = False def error(self, msg): + # overriden OptionValueError exception handler self.print_usage(sys.stderr) - sys.stderr.write("SCons error: %s\n" % msg) + sys.stderr.write("SCons Error: %s\n" % msg) sys.exit(2) def _process_long_opt(self, rargs, values): @@ -568,11 +569,15 @@ def Parser(version): action="store_true", help="Print build actions for files from CacheDir.") + def opt_invalid(group, value, options): + errmsg = "`%s' is not a valid %s option type, try:\n" % (value, group) + return errmsg + " %s" % ", ".join(options) + config_options = ["auto", "force" ,"cache"] def opt_config(option, opt, value, parser, c_options=config_options): if not value in c_options: - raise OptionValueError("Warning: %s is not a valid config type" % value) + raise OptionValueError(opt_invalid('config', value, c_options)) setattr(parser.values, option.dest, value) opt_config_help = "Controls Configure subsystem: %s." \ % ", ".join(config_options) @@ -599,24 +604,25 @@ def Parser(version): debug_options = ["count", "duplicate", "explain", "findlibs", "includes", "memoizer", "memory", "objects", "pdb", "prepare", "presub", "stacktrace", - "time"] + list(deprecated_debug_options.keys()) + "time"] def opt_debug(option, opt, value, parser, debug_options=debug_options, deprecated_debug_options=deprecated_debug_options): if value in debug_options: parser.values.debug.append(value) - if value in deprecated_debug_options.keys(): - try: - parser.values.delayed_warnings - except AttributeError: - parser.values.delayed_warnings = [] - msg = deprecated_debug_options[value] - w = "The --debug=%s option is deprecated%s." % (value, msg) - t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w) - parser.values.delayed_warnings.append(t) + elif value in deprecated_debug_options.keys(): + parser.values.debug.append(value) + try: + parser.values.delayed_warnings + except AttributeError: + parser.values.delayed_warnings = [] + msg = deprecated_debug_options[value] + w = "The --debug=%s option is deprecated%s." % (value, msg) + t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w) + parser.values.delayed_warnings.append(t) else: - raise OptionValueError("Warning: %s is not a valid debug type" % value) + raise OptionValueError(opt_invalid('debug', value, debug_options)) opt_debug_help = "Print various types of debugging information: %s." \ % ", ".join(debug_options) op.add_option('--debug', @@ -630,7 +636,7 @@ def Parser(version): try: diskcheck_value = diskcheck_convert(value) except ValueError, e: - raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e) + raise OptionValueError("`%s' is not a valid diskcheck type" % e) setattr(parser.values, option.dest, diskcheck_value) op.add_option('--diskcheck', @@ -642,7 +648,8 @@ def Parser(version): def opt_duplicate(option, opt, value, parser): if not value in SCons.Node.FS.Valid_Duplicates: - raise OptionValueError("`%s' is not a valid duplication style." % value) + raise OptionValueError(opt_invalid('duplication', value, + SCons.Node.FS.Valid_Duplicates)) setattr(parser.values, option.dest, value) # Set the duplicate style right away so it can affect linking # of SConscript files. @@ -807,7 +814,7 @@ def Parser(version): elif o == 'status': tp.status = True else: - raise OptionValueError("Warning: %s is not a valid --tree option" % o) + raise OptionValueError(opt_invalid('--tree', o, tree_options)) parser.values.tree_printers.append(tp) opt_tree_help = "Print a dependency tree in various formats: %s." \ diff --git a/scons/scons-local-2.2.0/SCons/Script/SConscript.py b/scons/scons-local-2.3.0/SCons/Script/SConscript.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Script/SConscript.py rename to scons/scons-local-2.3.0/SCons/Script/SConscript.py index 18a9e310a..59039eaf9 100644 --- a/scons/scons-local-2.2.0/SCons/Script/SConscript.py +++ b/scons/scons-local-2.3.0/SCons/Script/SConscript.py @@ -6,7 +6,7 @@ files. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -28,7 +28,7 @@ files. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import division -__revision__ = "src/engine/SCons/Script/SConscript.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Script/SConscript.py 2013/03/03 09:48:35 garyo" import SCons import SCons.Action @@ -473,13 +473,8 @@ class SConsEnvironment(SCons.Environment.Base): def EnsurePythonVersion(self, major, minor): """Exit abnormally if the Python version is not late enough.""" - try: - v_major, v_minor, v_micro, release, serial = sys.version_info - python_ver = (v_major, v_minor) - except AttributeError: - python_ver = self._get_major_minor_revision(sys.version)[:2] - if python_ver < (major, minor): - v = sys.version.split(" ", 1)[0] + if sys.version_info < (major, minor): + v = sys.version.split()[0] print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v) sys.exit(2) diff --git a/scons/scons-local-2.2.0/SCons/Script/__init__.py b/scons/scons-local-2.3.0/SCons/Script/__init__.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Script/__init__.py rename to scons/scons-local-2.3.0/SCons/Script/__init__.py index c0a031adb..5b3eac812 100644 --- a/scons/scons-local-2.2.0/SCons/Script/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Script/__init__.py @@ -12,7 +12,7 @@ it goes here. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -34,7 +34,7 @@ it goes here. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Script/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Script/__init__.py 2013/03/03 09:48:35 garyo" import time start_time = time.time() diff --git a/scons/scons-local-2.2.0/SCons/Sig.py b/scons/scons-local-2.3.0/SCons/Sig.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Sig.py rename to scons/scons-local-2.3.0/SCons/Sig.py index 41289a0f6..a14a99f42 100644 --- a/scons/scons-local-2.2.0/SCons/Sig.py +++ b/scons/scons-local-2.3.0/SCons/Sig.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Sig.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Sig.py 2013/03/03 09:48:35 garyo" __doc__ = """Place-holder for the old SCons.Sig module hierarchy diff --git a/scons/scons-local-2.2.0/SCons/Subst.py b/scons/scons-local-2.3.0/SCons/Subst.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Subst.py rename to scons/scons-local-2.3.0/SCons/Subst.py index 8d9d3a43a..94a0df800 100644 --- a/scons/scons-local-2.2.0/SCons/Subst.py +++ b/scons/scons-local-2.3.0/SCons/Subst.py @@ -5,7 +5,7 @@ SCons string substitution. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ SCons string substitution. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Subst.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Subst.py 2013/03/03 09:48:35 garyo" import collections import re diff --git a/scons/scons-local-2.2.0/SCons/Taskmaster.py b/scons/scons-local-2.3.0/SCons/Taskmaster.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Taskmaster.py rename to scons/scons-local-2.3.0/SCons/Taskmaster.py index cd95fb081..461023a01 100644 --- a/scons/scons-local-2.2.0/SCons/Taskmaster.py +++ b/scons/scons-local-2.3.0/SCons/Taskmaster.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -47,7 +47,7 @@ interface and the SCons build engine. There are two key classes here: target(s) that it decides need to be evaluated and/or built. """ -__revision__ = "src/engine/SCons/Taskmaster.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Taskmaster.py 2013/03/03 09:48:35 garyo" from itertools import chain import operator diff --git a/scons/scons-local-2.2.0/SCons/Tool/386asm.py b/scons/scons-local-2.3.0/SCons/Tool/386asm.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/386asm.py rename to scons/scons-local-2.3.0/SCons/Tool/386asm.py index bf32a0b7d..2b26c0f95 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/386asm.py +++ b/scons/scons-local-2.3.0/SCons/Tool/386asm.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/386asm.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/386asm.py 2013/03/03 09:48:35 garyo" from SCons.Tool.PharLapCommon import addPharLapPaths import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/BitKeeper.py b/scons/scons-local-2.3.0/SCons/Tool/BitKeeper.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/BitKeeper.py rename to scons/scons-local-2.3.0/SCons/Tool/BitKeeper.py index 60445db1e..288ef909f 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/BitKeeper.py +++ b/scons/scons-local-2.3.0/SCons/Tool/BitKeeper.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/BitKeeper.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/BitKeeper.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/CVS.py b/scons/scons-local-2.3.0/SCons/Tool/CVS.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/CVS.py rename to scons/scons-local-2.3.0/SCons/Tool/CVS.py index 87a6f1a32..3e60643ee 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/CVS.py +++ b/scons/scons-local-2.3.0/SCons/Tool/CVS.py @@ -8,7 +8,7 @@ selection method. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/CVS.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/CVS.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/FortranCommon.py b/scons/scons-local-2.3.0/SCons/Tool/FortranCommon.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/FortranCommon.py rename to scons/scons-local-2.3.0/SCons/Tool/FortranCommon.py index 2efcfa27b..7b470a2a1 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/FortranCommon.py +++ b/scons/scons-local-2.3.0/SCons/Tool/FortranCommon.py @@ -5,7 +5,7 @@ Stuff for processing Fortran, common to all fortran dialects. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Stuff for processing Fortran, common to all fortran dialects. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/FortranCommon.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/FortranCommon.py 2013/03/03 09:48:35 garyo" import re import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/GettextCommon.py b/scons/scons-local-2.3.0/SCons/Tool/GettextCommon.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/GettextCommon.py rename to scons/scons-local-2.3.0/SCons/Tool/GettextCommon.py index b2d848c44..2b1b9254c 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/GettextCommon.py +++ b/scons/scons-local-2.3.0/SCons/Tool/GettextCommon.py @@ -3,7 +3,7 @@ Used by several tools of `gettext` toolset. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -24,7 +24,7 @@ Used by several tools of `gettext` toolset. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/GettextCommon.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/GettextCommon.py 2013/03/03 09:48:35 garyo" import SCons.Warnings import re @@ -225,8 +225,9 @@ class _POFileBuilder(BuilderBase): import SCons.Environment ############################################################################# -def _translate(env, target=[], source=SCons.Environment._null, *args, **kw): +def _translate(env, target=None, source=SCons.Environment._null, *args, **kw): """ Function for `Translate()` pseudo-builder """ + if target is None: target = [] pot = env.POTUpdate(None, source, *args, **kw) po = env.POUpdate(target, pot, *args, **kw) return po diff --git a/scons/scons-local-2.2.0/SCons/Tool/JavaCommon.py b/scons/scons-local-2.3.0/SCons/Tool/JavaCommon.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/JavaCommon.py rename to scons/scons-local-2.3.0/SCons/Tool/JavaCommon.py index dc381053e..ea5e5bd58 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/JavaCommon.py +++ b/scons/scons-local-2.3.0/SCons/Tool/JavaCommon.py @@ -5,7 +5,7 @@ Stuff for processing Java. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Stuff for processing Java. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/JavaCommon.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/JavaCommon.py 2013/03/03 09:48:35 garyo" import os import os.path @@ -64,7 +64,7 @@ if java_parsing: interfaces, and anonymous inner classes.""" def __init__(self, version=default_java_version): - if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', + if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', '1.7', '5', '6'): msg = "Java version %s not supported" % version raise NotImplementedError(msg) @@ -171,7 +171,7 @@ if java_parsing: if self.version in ('1.1', '1.2', '1.3', '1.4'): clazz = self.listClasses[0] self.listOutputs.append('%s$%d' % (clazz, self.nextAnon)) - elif self.version in ('1.5', '1.6', '5', '6'): + elif self.version in ('1.5', '1.6', '1.7', '5', '6'): self.stackAnonClassBrackets.append(self.brackets) className = [] className.extend(self.listClasses) diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/__init__.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/__init__.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/__init__.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/__init__.py index 8dc6c5a61..37226633b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/__init__.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py 2013/03/03 09:48:35 garyo" __doc__ = """ Common functions for Microsoft Visual Studio and Visual C/C++. diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/arch.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/arch.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/arch.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/arch.py index 1b6ac9ef0..e6eb38228 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/arch.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/arch.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py 2013/03/03 09:48:35 garyo" __doc__ = """Module to define supported Windows chip architectures. """ diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/common.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/common.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/common.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/common.py index d10b7636c..e3fda5af1 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/common.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/common.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/MSCommon/common.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/common.py 2013/03/03 09:48:35 garyo" __doc__ = """ Common helper functions for working with the Microsoft tool chain. @@ -136,6 +136,8 @@ def get_output(vcbat, args = None, env = None): # settings in vs.py. vars = [ 'COMSPEC', + 'VS110COMNTOOLS', + 'VS100COMNTOOLS', 'VS90COMNTOOLS', 'VS80COMNTOOLS', 'VS71COMNTOOLS', diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/netframework.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/netframework.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/netframework.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/netframework.py index cc5aaf1bf..e1c12a643 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/netframework.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/netframework.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -20,7 +20,7 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py 2013/03/03 09:48:35 garyo" __doc__ = """ """ diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/sdk.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/sdk.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/sdk.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/sdk.py index fd22cd7be..1536a22bf 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/sdk.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/sdk.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py 2013/03/03 09:48:35 garyo" __doc__ = """Module to detect the Platform/Windows SDK diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/vc.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/vc.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/vc.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/vc.py index 9bbec2170..ec285c83b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/vc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/vc.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ # * test on 64 bits XP + VS 2005 (and VS 6 if possible) # * SDK # * Assembly -__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py 2013/03/03 09:48:35 garyo" __doc__ = """Module for Visual C/C++ detection and configuration. """ diff --git a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/vs.py b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/vs.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Tool/MSCommon/vs.py rename to scons/scons-local-2.3.0/SCons/Tool/MSCommon/vs.py index f5feb2a44..18b31a0be 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/MSCommon/vs.py +++ b/scons/scons-local-2.3.0/SCons/Tool/MSCommon/vs.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py 2013/03/03 09:48:35 garyo" __doc__ = """Module to detect Visual Studio and/or Visual C/C++ """ diff --git a/scons/scons-local-2.2.0/SCons/Tool/Perforce.py b/scons/scons-local-2.3.0/SCons/Tool/Perforce.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/Perforce.py rename to scons/scons-local-2.3.0/SCons/Tool/Perforce.py index ade9e88a7..3b56fee24 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/Perforce.py +++ b/scons/scons-local-2.3.0/SCons/Tool/Perforce.py @@ -8,7 +8,7 @@ selection method. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/Perforce.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/Perforce.py 2013/03/03 09:48:35 garyo" import os diff --git a/scons/scons-local-2.2.0/SCons/Tool/PharLapCommon.py b/scons/scons-local-2.3.0/SCons/Tool/PharLapCommon.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/PharLapCommon.py rename to scons/scons-local-2.3.0/SCons/Tool/PharLapCommon.py index 0f54a2ba9..7602073f2 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/PharLapCommon.py +++ b/scons/scons-local-2.3.0/SCons/Tool/PharLapCommon.py @@ -7,7 +7,7 @@ Phar Lap ETS tool chain. Right now, this is linkloc and """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ Phar Lap ETS tool chain. Right now, this is linkloc and # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/PharLapCommon.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/PharLapCommon.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/RCS.py b/scons/scons-local-2.3.0/SCons/Tool/RCS.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/RCS.py rename to scons/scons-local-2.3.0/SCons/Tool/RCS.py index cc33a4eea..05505ac8b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/RCS.py +++ b/scons/scons-local-2.3.0/SCons/Tool/RCS.py @@ -8,7 +8,7 @@ selection method. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/RCS.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/RCS.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/SCCS.py b/scons/scons-local-2.3.0/SCons/Tool/SCCS.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/SCCS.py rename to scons/scons-local-2.3.0/SCons/Tool/SCCS.py index 5e35a8758..6f795a5cc 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/SCCS.py +++ b/scons/scons-local-2.3.0/SCons/Tool/SCCS.py @@ -8,7 +8,7 @@ selection method. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/SCCS.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/SCCS.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/Subversion.py b/scons/scons-local-2.3.0/SCons/Tool/Subversion.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/Subversion.py rename to scons/scons-local-2.3.0/SCons/Tool/Subversion.py index 212850fe3..41771ad28 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/Subversion.py +++ b/scons/scons-local-2.3.0/SCons/Tool/Subversion.py @@ -8,7 +8,7 @@ selection method. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/Subversion.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/Subversion.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/__init__.py b/scons/scons-local-2.3.0/SCons/Tool/__init__.py similarity index 83% rename from scons/scons-local-2.2.0/SCons/Tool/__init__.py rename to scons/scons-local-2.3.0/SCons/Tool/__init__.py index 5bee64dd9..b12095f94 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Tool/__init__.py @@ -14,7 +14,7 @@ tool definition. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -35,10 +35,13 @@ tool definition. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/__init__.py 2013/03/03 09:48:35 garyo" import imp import sys +import re +import os +import shutil import SCons.Builder import SCons.Errors @@ -233,6 +236,120 @@ def createStaticLibBuilder(env): return static_lib +def VersionShLibLinkNames(version, libname, env): + """Generate names of symlinks to the versioned shared library""" + Verbose = False + platform = env.subst('$PLATFORM') + shlib_suffix = env.subst('$SHLIBSUFFIX') + shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS')) + + linknames = [] + if version.count(".") != 2: + # We need a version string of the form x.y.z to proceed + # Several changes need to be made to support versions like x.y + raise ValueError + + if platform == 'darwin': + # For libfoo.x.y.z.dylib, linknames libfoo.so + suffix_re = re.escape('.' + version + shlib_suffix) + linkname = re.sub(suffix_re, shlib_suffix, libname) + if Verbose: + print "VersionShLibLinkNames: linkname = ",linkname + linknames.append(linkname) + elif platform == 'posix': + # For libfoo.so.x.y.z, linknames libfoo.so libfoo.so.x.y libfoo.so.x + suffix_re = re.escape(shlib_suffix + '.' + version) + # First linkname has no version number + linkname = re.sub(suffix_re, shlib_suffix, libname) + if Verbose: + print "VersionShLibLinkNames: linkname = ",linkname + linknames.append(linkname) + versionparts = version.split('.') + major_name = linkname + "." + versionparts[0] + minor_name = major_name + "." + versionparts[1] + #Only add link for major_name + #for linkname in [major_name, minor_name]: + for linkname in [major_name, ]: + if Verbose: + print "VersionShLibLinkNames: linkname ",linkname, ", target ",libname + linknames.append(linkname) + # note: no Windows case here (win32 or cygwin); + # MSVC doesn't support this type of versioned shared libs. + # (could probably do something for MinGW though) + return linknames + +def VersionedSharedLibrary(target = None, source= None, env=None): + """Build a shared library. If the environment has SHLIBVERSION +defined make a versioned shared library and create the appropriate +symlinks for the platform we are on""" + Verbose = False + try: + version = env.subst('$SHLIBVERSION') + except KeyError: + version = None + + # libname includes the version number if one was given + libname = target[0].name + platform = env.subst('$PLATFORM') + shlib_suffix = env.subst('$SHLIBSUFFIX') + shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS')) + if Verbose: + print "VersionShLib: libname = ",libname + print "VersionShLib: platform = ",platform + print "VersionShLib: shlib_suffix = ",shlib_suffix + print "VersionShLib: target = ",str(target[0]) + + if version: + # set the shared library link flags + if platform == 'posix': + suffix_re = re.escape(shlib_suffix + '.' + version) + (major, age, revision) = version.split(".") + # soname will have only the major version number in it + soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major + shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,-soname=%s' % soname ] + if Verbose: + print " soname ",soname,", shlink_flags ",shlink_flags + elif platform == 'cygwin': + shlink_flags += [ '-Wl,-Bsymbolic', + '-Wl,--out-implib,${TARGET.base}.a' ] + elif platform == 'darwin': + shlink_flags += [ '-current_version', '%s' % version, + '-compatibility_version', '%s' % version, + '-undefined', 'dynamic_lookup' ] + if Verbose: + print "VersionShLib: shlink_flags = ",shlink_flags + envlink = env.Clone() + envlink['SHLINKFLAGS'] = shlink_flags + else: + envlink = env + + result = SCons.Defaults.ShLinkAction(target, source, envlink) + + if version: + # here we need the full pathname so the links end up in the right directory + libname = target[0].path + linknames = VersionShLibLinkNames(version, libname, env) + if Verbose: + print "VerShLib: linknames ",linknames + # Here we just need the file name w/o path as the target of the link + lib_ver = target[0].name + # make symlink of adjacent names in linknames + for count in range(len(linknames)): + linkname = linknames[count] + if count > 0: + os.symlink(os.path.basename(linkname),lastname) + if Verbose: + print "VerShLib: made sym link of %s -> %s" % (lastname,linkname) + lastname = linkname + # finish chain of sym links with link to the actual library + if len(linknames)>0: + os.symlink(lib_ver,lastname) + if Verbose: + print "VerShLib: made sym link of %s -> %s" % (lib_ver,linkname) + return result + +ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None) + def createSharedLibBuilder(env): """This is a utility function that creates the SharedLibrary Builder in an Environment if it is not there already. @@ -245,7 +362,7 @@ def createSharedLibBuilder(env): except KeyError: import SCons.Defaults action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.ShLinkAction ] + ShLibAction ] shared_lib = SCons.Builder.Builder(action = action_list, emitter = "$SHLIBEMITTER", prefix = '$SHLIBPREFIX', @@ -527,13 +644,16 @@ class ToolInitializer(object): # the ToolInitializer class. def Initializers(env): - ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs']) + ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs', '_InternalInstallVersionedLib']) def Install(self, *args, **kw): return self._InternalInstall(*args, **kw) def InstallAs(self, *args, **kw): return self._InternalInstallAs(*args, **kw) + def InstallVersionedLib(self, *args, **kw): + return self._InternalInstallVersionedLib(*args, **kw) env.AddMethod(Install) env.AddMethod(InstallAs) + env.AddMethod(InstallVersionedLib) def FindTool(tools, env): for tool in tools: @@ -679,3 +799,4 @@ def tool_list(platform, env): # indent-tabs-mode:nil # End: # vim: set expandtab tabstop=4 shiftwidth=4: + diff --git a/scons/scons-local-2.2.0/SCons/Tool/aixc++.py b/scons/scons-local-2.3.0/SCons/Tool/aixc++.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/aixc++.py rename to scons/scons-local-2.3.0/SCons/Tool/aixc++.py index fecfe766f..e9cc5c232 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/aixc++.py +++ b/scons/scons-local-2.3.0/SCons/Tool/aixc++.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/aixc++.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/aixc++.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/aixcc.py b/scons/scons-local-2.3.0/SCons/Tool/aixcc.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/aixcc.py rename to scons/scons-local-2.3.0/SCons/Tool/aixcc.py index d611fdcf0..44cb0ab14 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/aixcc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/aixcc.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/aixcc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/aixcc.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/aixf77.py b/scons/scons-local-2.3.0/SCons/Tool/aixf77.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/aixf77.py rename to scons/scons-local-2.3.0/SCons/Tool/aixf77.py index c3e062e00..19f8594b4 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/aixf77.py +++ b/scons/scons-local-2.3.0/SCons/Tool/aixf77.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/aixf77.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/aixf77.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/aixlink.py b/scons/scons-local-2.3.0/SCons/Tool/aixlink.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/aixlink.py rename to scons/scons-local-2.3.0/SCons/Tool/aixlink.py index 3a064bd2c..980568a3a 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/aixlink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/aixlink.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/aixlink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/aixlink.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/applelink.py b/scons/scons-local-2.3.0/SCons/Tool/applelink.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/applelink.py rename to scons/scons-local-2.3.0/SCons/Tool/applelink.py index 7b0cc1768..a67fc10cc 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/applelink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/applelink.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/applelink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/applelink.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/ar.py b/scons/scons-local-2.3.0/SCons/Tool/ar.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/ar.py rename to scons/scons-local-2.3.0/SCons/Tool/ar.py index 655e56b60..c11b5437d 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/ar.py +++ b/scons/scons-local-2.3.0/SCons/Tool/ar.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/ar.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/ar.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/as.py b/scons/scons-local-2.3.0/SCons/Tool/as.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/as.py rename to scons/scons-local-2.3.0/SCons/Tool/as.py index 6275d8136..29b0266e7 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/as.py +++ b/scons/scons-local-2.3.0/SCons/Tool/as.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/as.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/as.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/bcc32.py b/scons/scons-local-2.3.0/SCons/Tool/bcc32.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/bcc32.py rename to scons/scons-local-2.3.0/SCons/Tool/bcc32.py index c426e79e1..c152353b4 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/bcc32.py +++ b/scons/scons-local-2.3.0/SCons/Tool/bcc32.py @@ -5,7 +5,7 @@ XXX """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ XXX # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/bcc32.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/bcc32.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/c++.py b/scons/scons-local-2.3.0/SCons/Tool/c++.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/c++.py rename to scons/scons-local-2.3.0/SCons/Tool/c++.py index 8cd1dea29..18f4afe29 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/c++.py +++ b/scons/scons-local-2.3.0/SCons/Tool/c++.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/c++.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/c++.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/cc.py b/scons/scons-local-2.3.0/SCons/Tool/cc.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/cc.py rename to scons/scons-local-2.3.0/SCons/Tool/cc.py index 806f25131..00ecc2f25 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/cc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/cc.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/cc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/cc.py 2013/03/03 09:48:35 garyo" import SCons.Tool import SCons.Defaults diff --git a/scons/scons-local-2.2.0/SCons/Tool/cvf.py b/scons/scons-local-2.3.0/SCons/Tool/cvf.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/cvf.py rename to scons/scons-local-2.3.0/SCons/Tool/cvf.py index 2dcf195e1..2bf10da79 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/cvf.py +++ b/scons/scons-local-2.3.0/SCons/Tool/cvf.py @@ -5,7 +5,7 @@ Tool-specific initialization for the Compaq Visual Fortran compiler. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Tool-specific initialization for the Compaq Visual Fortran compiler. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/cvf.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/cvf.py 2013/03/03 09:48:35 garyo" import fortran diff --git a/scons/scons-local-2.2.0/SCons/Tool/default.py b/scons/scons-local-2.3.0/SCons/Tool/default.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/Tool/default.py rename to scons/scons-local-2.3.0/SCons/Tool/default.py index 292bd0ba3..4faab7ee1 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/default.py +++ b/scons/scons-local-2.3.0/SCons/Tool/default.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/default.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/default.py 2013/03/03 09:48:35 garyo" import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/dmd.py b/scons/scons-local-2.3.0/SCons/Tool/dmd.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/dmd.py rename to scons/scons-local-2.3.0/SCons/Tool/dmd.py index 839020f0c..3c73f80ea 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/dmd.py +++ b/scons/scons-local-2.3.0/SCons/Tool/dmd.py @@ -35,7 +35,7 @@ Lib tool variables: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -57,7 +57,7 @@ Lib tool variables: # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/dmd.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/dmd.py 2013/03/03 09:48:35 garyo" import os diff --git a/scons/scons-local-2.2.0/SCons/Tool/dvi.py b/scons/scons-local-2.3.0/SCons/Tool/dvi.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/dvi.py rename to scons/scons-local-2.3.0/SCons/Tool/dvi.py index 803758cfa..496e6988f 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/dvi.py +++ b/scons/scons-local-2.3.0/SCons/Tool/dvi.py @@ -5,7 +5,7 @@ Common DVI Builder definition for various other Tool modules that use it. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ Common DVI Builder definition for various other Tool modules that use it. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/dvi.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/dvi.py 2013/03/03 09:48:35 garyo" import SCons.Builder import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/dvipdf.py b/scons/scons-local-2.3.0/SCons/Tool/dvipdf.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/dvipdf.py rename to scons/scons-local-2.3.0/SCons/Tool/dvipdf.py index b931cf56d..5fe8d8892 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/dvipdf.py +++ b/scons/scons-local-2.3.0/SCons/Tool/dvipdf.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/dvipdf.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/dvipdf.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Defaults diff --git a/scons/scons-local-2.2.0/SCons/Tool/dvips.py b/scons/scons-local-2.3.0/SCons/Tool/dvips.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/dvips.py rename to scons/scons-local-2.3.0/SCons/Tool/dvips.py index 8b3ba0f54..a0f9e6fa8 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/dvips.py +++ b/scons/scons-local-2.3.0/SCons/Tool/dvips.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/dvips.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/dvips.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/f03.py b/scons/scons-local-2.3.0/SCons/Tool/f03.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/f03.py rename to scons/scons-local-2.3.0/SCons/Tool/f03.py index cc8f9d29d..791562541 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/f03.py +++ b/scons/scons-local-2.3.0/SCons/Tool/f03.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/f03.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/f03.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/f77.py b/scons/scons-local-2.3.0/SCons/Tool/f77.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/f77.py rename to scons/scons-local-2.3.0/SCons/Tool/f77.py index cba5b0b21..7f49892bb 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/f77.py +++ b/scons/scons-local-2.3.0/SCons/Tool/f77.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/f77.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/f77.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Scanner.Fortran diff --git a/scons/scons-local-2.2.0/SCons/Tool/f90.py b/scons/scons-local-2.3.0/SCons/Tool/f90.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/f90.py rename to scons/scons-local-2.3.0/SCons/Tool/f90.py index 1df001405..bd07ae0a5 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/f90.py +++ b/scons/scons-local-2.3.0/SCons/Tool/f90.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/f90.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/f90.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Scanner.Fortran diff --git a/scons/scons-local-2.2.0/SCons/Tool/f95.py b/scons/scons-local-2.3.0/SCons/Tool/f95.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/f95.py rename to scons/scons-local-2.3.0/SCons/Tool/f95.py index b32530905..5c16d484c 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/f95.py +++ b/scons/scons-local-2.3.0/SCons/Tool/f95.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/f95.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/f95.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/filesystem.py b/scons/scons-local-2.3.0/SCons/Tool/filesystem.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/filesystem.py rename to scons/scons-local-2.3.0/SCons/Tool/filesystem.py index 2ac49548f..431ad4c2b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/filesystem.py +++ b/scons/scons-local-2.3.0/SCons/Tool/filesystem.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/filesystem.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/filesystem.py 2013/03/03 09:48:35 garyo" import SCons from SCons.Tool.install import copyFunc diff --git a/scons/scons-local-2.2.0/SCons/Tool/fortran.py b/scons/scons-local-2.3.0/SCons/Tool/fortran.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/fortran.py rename to scons/scons-local-2.3.0/SCons/Tool/fortran.py index 3da748a94..35fcd5360 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/fortran.py +++ b/scons/scons-local-2.3.0/SCons/Tool/fortran.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/fortran.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/fortran.py 2013/03/03 09:48:35 garyo" import re diff --git a/scons/scons-local-2.2.0/SCons/Tool/g++.py b/scons/scons-local-2.3.0/SCons/Tool/g++.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/g++.py rename to scons/scons-local-2.3.0/SCons/Tool/g++.py index 484344c3c..be7d93536 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/g++.py +++ b/scons/scons-local-2.3.0/SCons/Tool/g++.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/g++.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/g++.py 2013/03/03 09:48:35 garyo" import os.path import re diff --git a/scons/scons-local-2.2.0/SCons/Tool/g77.py b/scons/scons-local-2.3.0/SCons/Tool/g77.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/g77.py rename to scons/scons-local-2.3.0/SCons/Tool/g77.py index 97c2ef184..5e1d1a1e6 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/g77.py +++ b/scons/scons-local-2.3.0/SCons/Tool/g77.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/g77.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/g77.py 2013/03/03 09:48:35 garyo" import SCons.Util from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env diff --git a/scons/scons-local-2.2.0/SCons/Tool/gas.py b/scons/scons-local-2.3.0/SCons/Tool/gas.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/gas.py rename to scons/scons-local-2.3.0/SCons/Tool/gas.py index 89aa2e344..143ede936 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/gas.py +++ b/scons/scons-local-2.3.0/SCons/Tool/gas.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/gas.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/gas.py 2013/03/03 09:48:35 garyo" as_module = __import__('as', globals(), locals(), []) diff --git a/scons/scons-local-2.2.0/SCons/Tool/gcc.py b/scons/scons-local-2.3.0/SCons/Tool/gcc.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/gcc.py rename to scons/scons-local-2.3.0/SCons/Tool/gcc.py index 814e1dec2..5b49ff83f 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/gcc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/gcc.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/gcc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/gcc.py 2013/03/03 09:48:35 garyo" import cc import os diff --git a/scons/scons-local-2.2.0/SCons/Tool/gettext.py b/scons/scons-local-2.3.0/SCons/Tool/gettext.py similarity index 86% rename from scons/scons-local-2.2.0/SCons/Tool/gettext.py rename to scons/scons-local-2.3.0/SCons/Tool/gettext.py index 9f2c70715..b561eda40 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/gettext.py +++ b/scons/scons-local-2.3.0/SCons/Tool/gettext.py @@ -2,7 +2,7 @@ """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -23,7 +23,7 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/gettext.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/gettext.py 2013/03/03 09:48:35 garyo" ############################################################################# def generate(env,**kw): @@ -40,6 +40,9 @@ def exists(env): from SCons.Tool.GettextCommon \ import _xgettext_exists, _msginit_exists, \ _msgmerge_exists, _msgfmt_exists - return _xgettext_exists(env) and _msginit_exists(env) \ - and _msgmerge_exists(env) and _msgfmt_exists(env) + try: + return _xgettext_exists(env) and _msginit_exists(env) \ + and _msgmerge_exists(env) and _msgfmt_exists(env) + except: + return False ############################################################################# diff --git a/scons/scons-local-2.2.0/SCons/Tool/gfortran.py b/scons/scons-local-2.3.0/SCons/Tool/gfortran.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/gfortran.py rename to scons/scons-local-2.3.0/SCons/Tool/gfortran.py index 2f9bddc64..463f70e78 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/gfortran.py +++ b/scons/scons-local-2.3.0/SCons/Tool/gfortran.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/gfortran.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/gfortran.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/gnulink.py b/scons/scons-local-2.3.0/SCons/Tool/gnulink.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/gnulink.py rename to scons/scons-local-2.3.0/SCons/Tool/gnulink.py index ee9f584e9..281a0d082 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/gnulink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/gnulink.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/gnulink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/gnulink.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/gs.py b/scons/scons-local-2.3.0/SCons/Tool/gs.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/gs.py rename to scons/scons-local-2.3.0/SCons/Tool/gs.py index 12e71d282..fc53b7e0a 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/gs.py +++ b/scons/scons-local-2.3.0/SCons/Tool/gs.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/gs.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/gs.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Platform diff --git a/scons/scons-local-2.2.0/SCons/Tool/hpc++.py b/scons/scons-local-2.3.0/SCons/Tool/hpc++.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/hpc++.py rename to scons/scons-local-2.3.0/SCons/Tool/hpc++.py index 5f75e1807..94b7fec7a 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/hpc++.py +++ b/scons/scons-local-2.3.0/SCons/Tool/hpc++.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/hpc++.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/hpc++.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/hpcc.py b/scons/scons-local-2.3.0/SCons/Tool/hpcc.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/hpcc.py rename to scons/scons-local-2.3.0/SCons/Tool/hpcc.py index 29586f623..efd523026 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/hpcc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/hpcc.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/hpcc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/hpcc.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/hplink.py b/scons/scons-local-2.3.0/SCons/Tool/hplink.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/hplink.py rename to scons/scons-local-2.3.0/SCons/Tool/hplink.py index d979545e6..627c9e946 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/hplink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/hplink.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/hplink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/hplink.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/icc.py b/scons/scons-local-2.3.0/SCons/Tool/icc.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/icc.py rename to scons/scons-local-2.3.0/SCons/Tool/icc.py index 1f7f02847..aa54a0ae2 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/icc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/icc.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/icc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/icc.py 2013/03/03 09:48:35 garyo" import cc diff --git a/scons/scons-local-2.2.0/SCons/Tool/icl.py b/scons/scons-local-2.3.0/SCons/Tool/icl.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/icl.py rename to scons/scons-local-2.3.0/SCons/Tool/icl.py index e3ee4ea5d..f0a252ba0 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/icl.py +++ b/scons/scons-local-2.3.0/SCons/Tool/icl.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/icl.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/icl.py 2013/03/03 09:48:35 garyo" import SCons.Tool.intelc diff --git a/scons/scons-local-2.2.0/SCons/Tool/ifl.py b/scons/scons-local-2.3.0/SCons/Tool/ifl.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/ifl.py rename to scons/scons-local-2.3.0/SCons/Tool/ifl.py index 6ad250abb..678a0d14a 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/ifl.py +++ b/scons/scons-local-2.3.0/SCons/Tool/ifl.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/ifl.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/ifl.py 2013/03/03 09:48:35 garyo" import SCons.Defaults from SCons.Scanner.Fortran import FortranScan diff --git a/scons/scons-local-2.2.0/SCons/Tool/ifort.py b/scons/scons-local-2.3.0/SCons/Tool/ifort.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/ifort.py rename to scons/scons-local-2.3.0/SCons/Tool/ifort.py index fde2e864f..80c170ba5 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/ifort.py +++ b/scons/scons-local-2.3.0/SCons/Tool/ifort.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/ifort.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/ifort.py 2013/03/03 09:48:35 garyo" import SCons.Defaults from SCons.Scanner.Fortran import FortranScan diff --git a/scons/scons-local-2.2.0/SCons/Tool/ilink.py b/scons/scons-local-2.3.0/SCons/Tool/ilink.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/ilink.py rename to scons/scons-local-2.3.0/SCons/Tool/ilink.py index 4f37906b9..7fa9b33b7 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/ilink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/ilink.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/ilink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/ilink.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/ilink32.py b/scons/scons-local-2.3.0/SCons/Tool/ilink32.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/ilink32.py rename to scons/scons-local-2.3.0/SCons/Tool/ilink32.py index 399501b6b..8b9cef66e 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/ilink32.py +++ b/scons/scons-local-2.3.0/SCons/Tool/ilink32.py @@ -5,7 +5,7 @@ XXX """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ XXX # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/ilink32.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/ilink32.py 2013/03/03 09:48:35 garyo" import SCons.Tool import SCons.Tool.bcc32 diff --git a/scons/scons-local-2.2.0/SCons/Tool/install.py b/scons/scons-local-2.3.0/SCons/Tool/install.py similarity index 56% rename from scons/scons-local-2.2.0/SCons/Tool/install.py rename to scons/scons-local-2.3.0/SCons/Tool/install.py index 8b0673b06..6f67fac27 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/install.py +++ b/scons/scons-local-2.3.0/SCons/Tool/install.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,9 +30,10 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/install.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/install.py 2013/03/03 09:48:35 garyo" import os +import re import shutil import stat @@ -121,6 +122,87 @@ def copyFunc(dest, source, env): return 0 +# +# Functions doing the actual work of the InstallVersionedLib Builder. +# +def copyFuncVersionedLib(dest, source, env): + """Install a versioned library into a destination by copying, + (including copying permission/mode bits) and then creating + required symlinks.""" + + if os.path.isdir(source): + raise SCons.Errors.UserError("cannot install directory `%s' as a version library" % str(source) ) + else: + shutil.copy2(source, dest) + st = os.stat(source) + os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) + versionedLibLinks(dest, source, env) + + return 0 + +def versionedLibVersion(dest, env): + """Check if dest is a version shared library name. Return version, libname, & install_dir if it is.""" + Verbose = False + platform = env.subst('$PLATFORM') + if not (platform == 'posix' or platform == 'darwin'): + return (None, None, None) + + libname = os.path.basename(dest) + install_dir = os.path.dirname(dest) + shlib_suffix = env.subst('$SHLIBSUFFIX') + # See if the source name is a versioned shared library, get the version number + result = False + + version_re = re.compile("[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+") + version_File = None + if platform == 'posix': + # handle unix names + versioned_re = re.compile(re.escape(shlib_suffix + '.') + "[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+") + result = versioned_re.findall(libname) + if result: + version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1] + elif platform == 'darwin': + # handle OSX names + versioned_re = re.compile("\\.[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+" + re.escape(shlib_suffix) ) + result = versioned_re.findall(libname) + if result: + version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1] + + if Verbose: + print "install: version_File ", version_File + # result is False if we did not find a versioned shared library name, so return and empty list + if not result: + return (None, libname, install_dir) + + version = None + # get version number from the environment + try: + version = env.subst('$SHLIBVERSION') + except KeyError: + version = None + + if version != version_File: + #raise SCons.Errors.UserError("SHLIBVERSION '%s' does not match the version # '%s' in the filename" % (version, version_File) ) + print "SHLIBVERSION '%s' does not match the version # '%s' in the filename, proceeding based on file name" % (version, version_File) + version = version_File + return (version, libname, install_dir) + +def versionedLibLinks(dest, source, env): + """If we are installing a versioned shared library create the required links.""" + Verbose = False + linknames = [] + version, libname, install_dir = versionedLibVersion(dest, env) + + if version != None: + # libname includes the version number if one was given + linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env) + for linkname in linknames: + if Verbose: + print "make link of %s to %s" %(libname, os.path.join(install_dir, linkname)) + fulllinkname = os.path.join(install_dir, linkname) + os.symlink(libname,fulllinkname) + return + def installFunc(target, source, env): """Install a source file into a target using the function specified as the INSTALL construction variable.""" @@ -137,6 +219,22 @@ def installFunc(target, source, env): return 0 +def installFuncVersionedLib(target, source, env): + """Install a versioned library into a target using the function specified + as the INSTALLVERSIONEDLIB construction variable.""" + try: + install = env['INSTALLVERSIONEDLIB'] + except KeyError: + raise SCons.Errors.UserError('Missing INSTALLVERSIONEDLIB construction variable.') + + assert len(target)==len(source), \ + "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target))) + for t,s in zip(target,source): + if install(t.get_path(),s.get_path(),env): + return 1 + + return 0 + def stringFunc(target, source, env): installstr = env.get('INSTALLSTR') if installstr: @@ -159,6 +257,31 @@ def add_targets_to_INSTALLED_FILES(target, source, env): """ global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES _INSTALLED_FILES.extend(target) + + _UNIQUE_INSTALLED_FILES = None + return (target, source) + +def add_versioned_targets_to_INSTALLED_FILES(target, source, env): + """ an emitter that adds all target files to the list stored in the + _INSTALLED_FILES global variable. This way all installed files of one + scons call will be collected. + """ + global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES + Verbose = False + _INSTALLED_FILES.extend(target) + + # see if we have a versioned shared library, if so generate side effects + version, libname, install_dir = versionedLibVersion(target[0].path, env) + if version != None: + # generate list of link names + linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env) + for linkname in linknames: + if Verbose: + print "make side effect of %s" % os.path.join(install_dir, linkname) + fulllinkname = os.path.join(install_dir, linkname) + env.SideEffect(fulllinkname,target[0]) + env.Clean(target[0],fulllinkname) + _UNIQUE_INSTALLED_FILES = None return (target, source) @@ -181,8 +304,9 @@ class DESTDIR_factory(object): # # The Builder Definition # -install_action = SCons.Action.Action(installFunc, stringFunc) -installas_action = SCons.Action.Action(installFunc, stringFunc) +install_action = SCons.Action.Action(installFunc, stringFunc) +installas_action = SCons.Action.Action(installFunc, stringFunc) +installVerLib_action = SCons.Action.Action(installFuncVersionedLib, stringFunc) BaseInstallBuilder = None @@ -223,6 +347,37 @@ def InstallAsBuilderWrapper(env, target=None, source=None, **kw): result.extend(BaseInstallBuilder(env, tgt, src, **kw)) return result +BaseVersionedInstallBuilder = None + +def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw): + if target and dir: + import SCons.Errors + raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.") + if not dir: + dir=target + + import SCons.Script + install_sandbox = SCons.Script.GetOption('install_sandbox') + if install_sandbox: + target_factory = DESTDIR_factory(env, install_sandbox) + else: + target_factory = env.fs + + try: + dnodes = env.arg2nodes(dir, target_factory.Dir) + except TypeError: + raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir)) + sources = env.arg2nodes(source, env.fs.Entry) + tgt = [] + for dnode in dnodes: + for src in sources: + # Prepend './' so the lookup doesn't interpret an initial + # '#' on the file name portion as meaning the Node should + # be relative to the top-level SConstruct directory. + target = env.fs.Entry('.'+os.sep+src.name, dnode) + tgt.extend(BaseVersionedInstallBuilder(env, target, src, **kw)) + return tgt + added = None def generate(env): @@ -253,8 +408,25 @@ def generate(env): emitter = [ add_targets_to_INSTALLED_FILES, ], name = 'InstallBuilder') + global BaseVersionedInstallBuilder + if BaseVersionedInstallBuilder is None: + install_sandbox = GetOption('install_sandbox') + if install_sandbox: + target_factory = DESTDIR_factory(env, install_sandbox) + else: + target_factory = env.fs + + BaseVersionedInstallBuilder = SCons.Builder.Builder( + action = installVerLib_action, + target_factory = target_factory.Entry, + source_factory = env.fs.Entry, + multi = 1, + emitter = [ add_versioned_targets_to_INSTALLED_FILES, ], + name = 'InstallVersionedBuilder') + env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper + env['BUILDERS']['_InternalInstallVersionedLib'] = InstallVersionedBuilderWrapper # We'd like to initialize this doing something like the following, # but there isn't yet support for a ${SOURCE.type} expansion that @@ -273,6 +445,11 @@ def generate(env): except KeyError: env['INSTALL'] = copyFunc + try: + env['INSTALLVERSIONEDLIB'] + except KeyError: + env['INSTALLVERSIONEDLIB'] = copyFuncVersionedLib + def exists(env): return 1 diff --git a/scons/scons-local-2.2.0/SCons/Tool/intelc.py b/scons/scons-local-2.3.0/SCons/Tool/intelc.py similarity index 89% rename from scons/scons-local-2.2.0/SCons/Tool/intelc.py rename to scons/scons-local-2.3.0/SCons/Tool/intelc.py index 92529afdc..5d267ff97 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/intelc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/intelc.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import division -__revision__ = "src/engine/SCons/Tool/intelc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/intelc.py 2013/03/03 09:48:35 garyo" import math, sys, os.path, glob, string, re @@ -78,6 +78,7 @@ def linux_ver_normalize(vstr): Always returns an old-style float like 80 or 90 for compatibility with Windows. Shades of Y2K!""" # Check for version number like 9.1.026: return 91.026 + # XXX needs to be updated for 2011+ versions (like 2011.11.344 which is compiler v12.1.5) m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr) if m: vmaj,vmin,build = m.groups() @@ -221,7 +222,7 @@ def get_all_compiler_versions(): except EnvironmentError: # no more subkeys pass - elif is_linux: + elif is_linux or is_mac: for d in glob.glob('/opt/intel_cc_*'): # Typical dir here is /opt/intel_cc_80. m = re.search(r'cc_(.*)$', d) @@ -238,13 +239,17 @@ def get_all_compiler_versions(): m = re.search(r'([0-9][0-9.]*)$', d) if m: versions.append(m.group(1)) - elif is_mac: - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) + for d in glob.glob('/opt/intel/composerxe-*'): + # Typical dir here is /opt/intel/composerxe-2011.4.184 m = re.search(r'([0-9][0-9.]*)$', d) if m: versions.append(m.group(1)) + for d in glob.glob('/opt/intel/composer_xe_*'): + # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344 + # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x + m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d) + if m: + versions.append("%s.%s"%(m.group(1), m.group(2))) def keyfunc(str): """Given a dot-separated version string, return a tuple of ints representing it.""" return [int(x) for x in str.split('.')] @@ -293,8 +298,33 @@ def get_intel_compiler_top(version, abi): top = d break return top - top = find_in_2010style_dir(version) or find_in_2008style_dir(version) - print "INTELC: top=",top + def find_in_2011style_dir(version): + # The 2011 (compiler v12) dirs are inconsistent, so just redo the search from + # get_all_compiler_versions and look for a match (search the newest form first) + top=None + for d in glob.glob('/opt/intel/composer_xe_*'): + # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344 + # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x + m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d) + if m: + cur_ver = "%s.%s"%(m.group(1), m.group(2)) + if cur_ver == version and \ + (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or + os.path.exists(os.path.join(d, "bin", "intel64", "icc"))): + top = d + break + if not top: + for d in glob.glob('/opt/intel/composerxe-*'): + # Typical dir here is /opt/intel/composerxe-2011.4.184 + m = re.search(r'([0-9][0-9.]*)$', d) + if m and m.group(1) == verison and \ + (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or + os.path.exists(os.path.join(d, "bin", "intel64", "icc"))): + top = d + break + return top + top = find_in_2011style_dir(version) or find_in_2010style_dir(version) or find_in_2008style_dir(version) + # print "INTELC: top=",top if not top: raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi)) return top diff --git a/scons/scons-local-2.2.0/SCons/Tool/ipkg.py b/scons/scons-local-2.3.0/SCons/Tool/ipkg.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/ipkg.py rename to scons/scons-local-2.3.0/SCons/Tool/ipkg.py index bc56dcd38..2abc0e639 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/ipkg.py +++ b/scons/scons-local-2.3.0/SCons/Tool/ipkg.py @@ -11,7 +11,7 @@ packages fake_root. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -33,7 +33,7 @@ packages fake_root. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/ipkg.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/ipkg.py 2013/03/03 09:48:35 garyo" import os diff --git a/scons/scons-local-2.2.0/SCons/Tool/jar.py b/scons/scons-local-2.3.0/SCons/Tool/jar.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/jar.py rename to scons/scons-local-2.3.0/SCons/Tool/jar.py index 321006c8f..ec8afcac9 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/jar.py +++ b/scons/scons-local-2.3.0/SCons/Tool/jar.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/jar.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/jar.py 2013/03/03 09:48:35 garyo" import SCons.Subst import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/javac.py b/scons/scons-local-2.3.0/SCons/Tool/javac.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/javac.py rename to scons/scons-local-2.3.0/SCons/Tool/javac.py index b682cbf0f..a039ace5e 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/javac.py +++ b/scons/scons-local-2.3.0/SCons/Tool/javac.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/javac.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/javac.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/javah.py b/scons/scons-local-2.3.0/SCons/Tool/javah.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/javah.py rename to scons/scons-local-2.3.0/SCons/Tool/javah.py index be5145d48..6e8089c6c 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/javah.py +++ b/scons/scons-local-2.3.0/SCons/Tool/javah.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/javah.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/javah.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/latex.py b/scons/scons-local-2.3.0/SCons/Tool/latex.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/latex.py rename to scons/scons-local-2.3.0/SCons/Tool/latex.py index 427c37324..75033bc13 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/latex.py +++ b/scons/scons-local-2.3.0/SCons/Tool/latex.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/latex.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/latex.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Defaults diff --git a/scons/scons-local-2.2.0/SCons/Tool/lex.py b/scons/scons-local-2.3.0/SCons/Tool/lex.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/lex.py rename to scons/scons-local-2.3.0/SCons/Tool/lex.py index 76e899248..63277309f 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/lex.py +++ b/scons/scons-local-2.3.0/SCons/Tool/lex.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/lex.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/lex.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/link.py b/scons/scons-local-2.3.0/SCons/Tool/link.py similarity index 60% rename from scons/scons-local-2.2.0/SCons/Tool/link.py rename to scons/scons-local-2.3.0/SCons/Tool/link.py index 13a671d76..008a7d799 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/link.py +++ b/scons/scons-local-2.3.0/SCons/Tool/link.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,9 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/link.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/link.py 2013/03/03 09:48:35 garyo" + +import re import SCons.Defaults import SCons.Tool @@ -64,10 +66,71 @@ def smart_link(source, target, env, for_signature): return '$CC' def shlib_emitter(target, source, env): + Verbose = False + platform = env.subst('$PLATFORM') for tgt in target: tgt.attributes.shared = 1 + try: + # target[0] comes in as libtest.so. Add the version extensions + version = env.subst('$SHLIBVERSION') + if version: + version_names = shlib_emitter_names(target, source, env) + # change the name of the target to include the version number + target[0].name = version_names[0] + for name in version_names: + env.SideEffect(name, target[0]) + env.Clean(target[0], name) + if Verbose: + print "shlib_emitter: add side effect - ",name + except KeyError: + version = None return (target, source) +def shlib_emitter_names(target, source, env): + """Return list of file names that are side effects for a versioned library build. The first name in the list is the new name for the target""" + Verbose = False + platform = env.subst('$PLATFORM') + version_names = [] + try: + # target[0] comes in as libtest.so. Add the version extensions + version = env.subst('$SHLIBVERSION') + if version.count(".") != 2: + # We need a version of the form x.y.z to proceed + raise ValueError + if version: + if platform == 'posix': + versionparts = version.split('.') + name = target[0].name + # generate library name with the version number + version_name = target[0].name + '.' + version + if Verbose: + print "shlib_emitter_names: target is ", version_name + print "shlib_emitter_names: side effect: ", name + # add version_name to list of names to be a Side effect + version_names.append(version_name) + if Verbose: + print "shlib_emitter_names: versionparts ",versionparts + for ver in versionparts[0:-1]: + name = name + '.' + ver + if Verbose: + print "shlib_emitter_names: side effect: ", name + # add name to list of names to be a Side effect + version_names.append(name) + elif platform == 'darwin': + shlib_suffix = env.subst('$SHLIBSUFFIX') + name = target[0].name + # generate library name with the version number + suffix_re = re.escape(shlib_suffix) + version_name = re.sub(suffix_re, '.' + version + shlib_suffix, name) + if Verbose: + print "shlib_emitter_names: target is ", version_name + print "shlib_emitter_names: side effect: ", name + # add version_name to list of names to be a Side effect + version_names.append(version_name) + except KeyError: + version = None + return version_names + def generate(env): """Add Builders and construction variables for gnulink to an Environment.""" SCons.Tool.createSharedLibBuilder(env) diff --git a/scons/scons-local-2.2.0/SCons/Tool/linkloc.py b/scons/scons-local-2.3.0/SCons/Tool/linkloc.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/linkloc.py rename to scons/scons-local-2.3.0/SCons/Tool/linkloc.py index 50a1a5159..6fdd4da4f 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/linkloc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/linkloc.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/linkloc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/linkloc.py 2013/03/03 09:48:35 garyo" import os.path import re diff --git a/scons/scons-local-2.2.0/SCons/Tool/m4.py b/scons/scons-local-2.3.0/SCons/Tool/m4.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/m4.py rename to scons/scons-local-2.3.0/SCons/Tool/m4.py index 9bd4ef7c8..dfef65945 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/m4.py +++ b/scons/scons-local-2.3.0/SCons/Tool/m4.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/m4.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/m4.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/masm.py b/scons/scons-local-2.3.0/SCons/Tool/masm.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/masm.py rename to scons/scons-local-2.3.0/SCons/Tool/masm.py index f41f700a2..b7fb94ede 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/masm.py +++ b/scons/scons-local-2.3.0/SCons/Tool/masm.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/masm.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/masm.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/midl.py b/scons/scons-local-2.3.0/SCons/Tool/midl.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/midl.py rename to scons/scons-local-2.3.0/SCons/Tool/midl.py index 2cdcd5ae1..a69406d1a 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/midl.py +++ b/scons/scons-local-2.3.0/SCons/Tool/midl.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/midl.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/midl.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/mingw.py b/scons/scons-local-2.3.0/SCons/Tool/mingw.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/mingw.py rename to scons/scons-local-2.3.0/SCons/Tool/mingw.py index 1c9c0829f..a81c94ccf 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/mingw.py +++ b/scons/scons-local-2.3.0/SCons/Tool/mingw.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/mingw.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/mingw.py 2013/03/03 09:48:35 garyo" import os import os.path @@ -133,7 +133,7 @@ def generate(env): # Most of mingw is the same as gcc and friends... - gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'm4'] + gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'gfortran', 'm4'] for tool in gnu_tools: SCons.Tool.Tool(tool)(env) @@ -168,6 +168,7 @@ def generate(env): env['OBJSUFFIX'] = '.o' env['LIBPREFIX'] = 'lib' env['LIBSUFFIX'] = '.a' + env['PROGSUFFIX'] = '.exe' def exists(env): return find(env) diff --git a/scons/scons-local-2.2.0/SCons/Tool/msgfmt.py b/scons/scons-local-2.3.0/SCons/Tool/msgfmt.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/msgfmt.py rename to scons/scons-local-2.3.0/SCons/Tool/msgfmt.py index 4fcd8fcc4..d444ae21e 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/msgfmt.py +++ b/scons/scons-local-2.3.0/SCons/Tool/msgfmt.py @@ -1,6 +1,6 @@ """ msgfmt tool """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msgfmt.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/msgfmt.py 2013/03/03 09:48:35 garyo" from SCons.Builder import BuilderBase ############################################################################# @@ -77,7 +77,10 @@ def generate(env,**kw): """ Generate `msgfmt` tool """ import SCons.Util from SCons.Tool.GettextCommon import _detect_msgfmt - env['MSGFMT'] = _detect_msgfmt(env) + try: + env['MSGFMT'] = _detect_msgfmt(env) + except: + env['MSGFMT'] = 'msgfmt' env.SetDefault( MSGFMTFLAGS = [ SCons.Util.CLVar('-c') ], MSGFMTCOM = '$MSGFMT $MSGFMTFLAGS -o $TARGET $SOURCE', @@ -92,7 +95,10 @@ def generate(env,**kw): def exists(env): """ Check if the tool exists """ from SCons.Tool.GettextCommon import _msgfmt_exists - return _msgfmt_exists(env) + try: + return _msgfmt_exists(env) + except: + return False ############################################################################# # Local Variables: diff --git a/scons/scons-local-2.2.0/SCons/Tool/msginit.py b/scons/scons-local-2.3.0/SCons/Tool/msginit.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/msginit.py rename to scons/scons-local-2.3.0/SCons/Tool/msginit.py index 210fbca58..fcbd564c0 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/msginit.py +++ b/scons/scons-local-2.3.0/SCons/Tool/msginit.py @@ -3,7 +3,7 @@ Tool specific initialization of msginit tool. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -24,7 +24,7 @@ Tool specific initialization of msginit tool. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msginit.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/msginit.py 2013/03/03 09:48:35 garyo" import SCons.Warnings import SCons.Builder @@ -79,7 +79,10 @@ def generate(env,**kw): """ Generate the `msginit` tool """ import SCons.Util from SCons.Tool.GettextCommon import _detect_msginit - env['MSGINIT'] = _detect_msginit(env) + try: + env['MSGINIT'] = _detect_msginit(env) + except: + env['MSGINIT'] = 'msginit' msginitcom = '$MSGINIT ${_MSGNoTranslator(__env__)} -l ${_MSGINITLOCALE}' \ + ' $MSGINITFLAGS -i $SOURCE -o $TARGET' # NOTE: We set POTSUFFIX here, in case the 'xgettext' is not loaded @@ -104,7 +107,10 @@ def generate(env,**kw): def exists(env): """ Check if the tool exists """ from SCons.Tool.GettextCommon import _msginit_exists - return _msginit_exists(env) + try: + return _msginit_exists(env) + except: + return False ############################################################################# # Local Variables: diff --git a/scons/scons-local-2.2.0/SCons/Tool/msgmerge.py b/scons/scons-local-2.3.0/SCons/Tool/msgmerge.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/msgmerge.py rename to scons/scons-local-2.3.0/SCons/Tool/msgmerge.py index 2bc89f4d5..35315f939 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/msgmerge.py +++ b/scons/scons-local-2.3.0/SCons/Tool/msgmerge.py @@ -3,7 +3,7 @@ Tool specific initialization for `msgmerge` tool. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -24,7 +24,7 @@ Tool specific initialization for `msgmerge` tool. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msgmerge.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/msgmerge.py 2013/03/03 09:48:35 garyo" ############################################################################# def _update_or_init_po_files(target, source, env): @@ -70,7 +70,10 @@ def _POUpdateBuilderWrapper(env, target=None, source=_null, **kw): def generate(env,**kw): """ Generate the `xgettext` tool """ from SCons.Tool.GettextCommon import _detect_msgmerge - env['MSGMERGE'] = _detect_msgmerge(env) + try: + env['MSGMERGE'] = _detect_msgmerge(env) + except: + env['MSGMERGE'] = 'msgmerge' env.SetDefault( POTSUFFIX = ['.pot'], POSUFFIX = ['.po'], @@ -88,7 +91,10 @@ def generate(env,**kw): def exists(env): """ Check if the tool exists """ from SCons.Tool.GettextCommon import _msgmerge_exists - return _msgmerge_exists(env) + try: + return _msgmerge_exists(env) + except: + return False ############################################################################# # Local Variables: diff --git a/scons/scons-local-2.2.0/SCons/Tool/mslib.py b/scons/scons-local-2.3.0/SCons/Tool/mslib.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/mslib.py rename to scons/scons-local-2.3.0/SCons/Tool/mslib.py index 82ea50323..b85186728 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/mslib.py +++ b/scons/scons-local-2.3.0/SCons/Tool/mslib.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/mslib.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/mslib.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/mslink.py b/scons/scons-local-2.3.0/SCons/Tool/mslink.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/mslink.py rename to scons/scons-local-2.3.0/SCons/Tool/mslink.py index 1f53295da..a35d7dab2 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/mslink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/mslink.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/mslink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/mslink.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/mssdk.py b/scons/scons-local-2.3.0/SCons/Tool/mssdk.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/mssdk.py rename to scons/scons-local-2.3.0/SCons/Tool/mssdk.py index f871c7d5a..84291bcba 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/mssdk.py +++ b/scons/scons-local-2.3.0/SCons/Tool/mssdk.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/mssdk.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/mssdk.py 2013/03/03 09:48:35 garyo" """engine.SCons.Tool.mssdk diff --git a/scons/scons-local-2.2.0/SCons/Tool/msvc.py b/scons/scons-local-2.3.0/SCons/Tool/msvc.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/msvc.py rename to scons/scons-local-2.3.0/SCons/Tool/msvc.py index eb479a35b..552c8ef04 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/msvc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/msvc.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/msvc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/msvc.py 2013/03/03 09:48:35 garyo" import os.path import re diff --git a/scons/scons-local-2.2.0/SCons/Tool/msvs.py b/scons/scons-local-2.3.0/SCons/Tool/msvs.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Tool/msvs.py rename to scons/scons-local-2.3.0/SCons/Tool/msvs.py index c0443d96d..24f382742 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/msvs.py +++ b/scons/scons-local-2.3.0/SCons/Tool/msvs.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msvs.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/msvs.py 2013/03/03 09:48:35 garyo" import SCons.compat @@ -1206,7 +1206,7 @@ class _GenerateV7DSW(_DSWGenerator): self.version_num, self.suite = msvs_parse_version(self.version) self.versionstr = '7.00' if self.version_num >= 11.0: - self.versionstr = '12.0' + self.versionstr = '12.00' elif self.version_num >= 10.0: self.versionstr = '11.00' elif self.version_num >= 9.0: @@ -1311,7 +1311,7 @@ class _GenerateV7DSW(_DSWGenerator): def PrintSolution(self): """Writes a solution file""" self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr) - if self.versionstr >= 11.0: + if self.version_num >= 11.0: self.file.write('# Visual Studio 11\n') elif self.version_num >= 10.0: self.file.write('# Visual Studio 2010\n') @@ -1654,6 +1654,10 @@ def projectEmitter(target, source, env): t, s = solutionEmitter(target, target, env) targetlist = targetlist + t + # Beginning with Visual Studio 2010 for each project file (.vcxproj) we have additional file (.vcxproj.filters) + if float(env['MSVS_VERSION']) >= 10.0: + targetlist.append(targetlist[0] + '.filters') + return (targetlist, sourcelist) def solutionEmitter(target, source, env): diff --git a/scons/scons-local-2.2.0/SCons/Tool/mwcc.py b/scons/scons-local-2.3.0/SCons/Tool/mwcc.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/mwcc.py rename to scons/scons-local-2.3.0/SCons/Tool/mwcc.py index 689c2739a..48433012f 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/mwcc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/mwcc.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/mwcc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/mwcc.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/mwld.py b/scons/scons-local-2.3.0/SCons/Tool/mwld.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/mwld.py rename to scons/scons-local-2.3.0/SCons/Tool/mwld.py index 30149c37e..ff875a57d 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/mwld.py +++ b/scons/scons-local-2.3.0/SCons/Tool/mwld.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/mwld.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/mwld.py 2013/03/03 09:48:35 garyo" import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/nasm.py b/scons/scons-local-2.3.0/SCons/Tool/nasm.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/nasm.py rename to scons/scons-local-2.3.0/SCons/Tool/nasm.py index e76b51ab1..d754a2afb 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/nasm.py +++ b/scons/scons-local-2.3.0/SCons/Tool/nasm.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/nasm.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/nasm.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/__init__.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/__init__.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/__init__.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/__init__.py index f2b953d67..b0a7549e2 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/__init__.py @@ -4,7 +4,7 @@ SCons Packaging Tool. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -25,7 +25,7 @@ SCons Packaging Tool. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/packaging/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/__init__.py 2013/03/03 09:48:35 garyo" import SCons.Environment from SCons.Variables import * diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/ipk.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/ipk.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/ipk.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/ipk.py index 251de8a33..77c6420d9 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/ipk.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/ipk.py @@ -2,7 +2,7 @@ """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -24,7 +24,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/ipk.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/ipk.py 2013/03/03 09:48:35 garyo" import SCons.Builder import SCons.Node.FS diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/msi.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/msi.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/msi.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/msi.py index dc593b338..26eb63041 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/msi.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/msi.py @@ -4,7 +4,7 @@ The msi packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -25,7 +25,7 @@ The msi packager. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/packaging/msi.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/msi.py 2013/03/03 09:48:35 garyo" import os import SCons diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/rpm.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/rpm.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/rpm.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/rpm.py index 1c83b6bba..d60166f7c 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/rpm.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/rpm.py @@ -4,7 +4,7 @@ The rpm packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -25,11 +25,12 @@ The rpm packager. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/packaging/rpm.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/rpm.py 2013/03/03 09:48:35 garyo" import os import SCons.Builder +import SCons.Tool.rpmutils from SCons.Environment import OverrideEnvironment from SCons.Tool.packaging import stripinstallbuilder, src_targz @@ -52,16 +53,7 @@ def package(env, target, source, PACKAGEROOT, NAME, VERSION, else: # This should be overridable from the construction environment, # which it is by using ARCHITECTURE=. - # Guessing based on what os.uname() returns at least allows it - # to work for both i386 and x86_64 Linux systems. - archmap = { - 'i686' : 'i386', - 'i586' : 'i386', - 'i486' : 'i386', - } - - buildarchitecture = os.uname()[4] - buildarchitecture = archmap.get(buildarchitecture, buildarchitecture) + buildarchitecture = SCons.Tool.rpmutils.defaultMachine() if 'ARCHITECTURE' in kw: buildarchitecture = kw['ARCHITECTURE'] diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/src_tarbz2.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/src_tarbz2.py similarity index 90% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/src_tarbz2.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/src_tarbz2.py index 41c37ac4b..1da2becae 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/src_tarbz2.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/src_tarbz2.py @@ -4,7 +4,7 @@ The tarbz2 SRC packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ The tarbz2 SRC packager. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py 2013/03/03 09:48:35 garyo" from SCons.Tool.packaging import putintopackageroot diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/src_targz.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/src_targz.py similarity index 90% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/src_targz.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/src_targz.py index dbf1c2bbe..bde3316fe 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/src_targz.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/src_targz.py @@ -4,7 +4,7 @@ The targz SRC packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ The targz SRC packager. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py 2013/03/03 09:48:35 garyo" from SCons.Tool.packaging import putintopackageroot diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/src_zip.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/src_zip.py similarity index 90% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/src_zip.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/src_zip.py index e12c3667b..e5a752e36 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/src_zip.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/src_zip.py @@ -4,7 +4,7 @@ The zip SRC packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ The zip SRC packager. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py 2013/03/03 09:48:35 garyo" from SCons.Tool.packaging import putintopackageroot diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/tarbz2.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/tarbz2.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/tarbz2.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/tarbz2.py index 73964eb83..0c8e4e768 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/tarbz2.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/tarbz2.py @@ -4,7 +4,7 @@ The tarbz2 SRC packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ The tarbz2 SRC packager. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py 2013/03/03 09:48:35 garyo" from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/targz.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/targz.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/targz.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/targz.py index 1019bdbf5..32b74cfb9 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/targz.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/targz.py @@ -4,7 +4,7 @@ The targz SRC packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ The targz SRC packager. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/targz.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/targz.py 2013/03/03 09:48:35 garyo" from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/scons/scons-local-2.2.0/SCons/Tool/packaging/zip.py b/scons/scons-local-2.3.0/SCons/Tool/packaging/zip.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/Tool/packaging/zip.py rename to scons/scons-local-2.3.0/SCons/Tool/packaging/zip.py index a96278749..1f34581e1 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/packaging/zip.py +++ b/scons/scons-local-2.3.0/SCons/Tool/packaging/zip.py @@ -4,7 +4,7 @@ The zip SRC packager. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ The zip SRC packager. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/packaging/zip.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/packaging/zip.py 2013/03/03 09:48:35 garyo" from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/scons/scons-local-2.2.0/SCons/Tool/pdf.py b/scons/scons-local-2.3.0/SCons/Tool/pdf.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/pdf.py rename to scons/scons-local-2.3.0/SCons/Tool/pdf.py index beae6dd2a..1b68f107b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/pdf.py +++ b/scons/scons-local-2.3.0/SCons/Tool/pdf.py @@ -6,7 +6,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -28,7 +28,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/pdf.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/pdf.py 2013/03/03 09:48:35 garyo" import SCons.Builder import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/pdflatex.py b/scons/scons-local-2.3.0/SCons/Tool/pdflatex.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/pdflatex.py rename to scons/scons-local-2.3.0/SCons/Tool/pdflatex.py index 9d2a449ec..80756d184 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/pdflatex.py +++ b/scons/scons-local-2.3.0/SCons/Tool/pdflatex.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/pdflatex.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/pdflatex.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/pdftex.py b/scons/scons-local-2.3.0/SCons/Tool/pdftex.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/pdftex.py rename to scons/scons-local-2.3.0/SCons/Tool/pdftex.py index b5898c17f..34ca325b0 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/pdftex.py +++ b/scons/scons-local-2.3.0/SCons/Tool/pdftex.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/pdftex.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/pdftex.py 2013/03/03 09:48:35 garyo" import os import SCons.Action diff --git a/scons/scons-local-2.2.0/SCons/Tool/qt.py b/scons/scons-local-2.3.0/SCons/Tool/qt.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Tool/qt.py rename to scons/scons-local-2.3.0/SCons/Tool/qt.py index d40337d44..96e14b1cf 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/qt.py +++ b/scons/scons-local-2.3.0/SCons/Tool/qt.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/qt.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/qt.py 2013/03/03 09:48:35 garyo" import os.path import re diff --git a/scons/scons-local-2.2.0/SCons/Tool/rmic.py b/scons/scons-local-2.3.0/SCons/Tool/rmic.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/rmic.py rename to scons/scons-local-2.3.0/SCons/Tool/rmic.py index 0b32f06bd..df90bc081 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/rmic.py +++ b/scons/scons-local-2.3.0/SCons/Tool/rmic.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/rmic.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/rmic.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/rpcgen.py b/scons/scons-local-2.3.0/SCons/Tool/rpcgen.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/rpcgen.py rename to scons/scons-local-2.3.0/SCons/Tool/rpcgen.py index c1542dc55..309db8299 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/rpcgen.py +++ b/scons/scons-local-2.3.0/SCons/Tool/rpcgen.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/rpcgen.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/rpcgen.py 2013/03/03 09:48:35 garyo" from SCons.Builder import Builder import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/rpm.py b/scons/scons-local-2.3.0/SCons/Tool/rpm.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/rpm.py rename to scons/scons-local-2.3.0/SCons/Tool/rpm.py index 3a4d6a928..ef31bd574 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/rpm.py +++ b/scons/scons-local-2.3.0/SCons/Tool/rpm.py @@ -11,7 +11,7 @@ tar.gz consisting of the source file and a specfile. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -33,7 +33,7 @@ tar.gz consisting of the source file and a specfile. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/rpm.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/rpm.py 2013/03/03 09:48:35 garyo" import os import re diff --git a/scons/scons-local-2.3.0/SCons/Tool/rpmutils.py b/scons/scons-local-2.3.0/SCons/Tool/rpmutils.py new file mode 100644 index 000000000..16d980a4f --- /dev/null +++ b/scons/scons-local-2.3.0/SCons/Tool/rpmutils.py @@ -0,0 +1,533 @@ +"""SCons.Tool.rpmutils.py + +RPM specific helper routines for general usage in the test framework +and SCons core modules. + +Since we check for the RPM package target name in several places, +we have to know which machine/system name RPM will use for the current +hardware setup. The following dictionaries and functions try to +mimic the exact naming rules of the RPM source code. +They were directly derived from the file "rpmrc.in" of the version +rpm-4.9.1.3. For updating to a more recent version of RPM, this Python +script can be used standalone. The usage() function below shows the +exact syntax. + +""" + +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +__revision__ = "src/engine/SCons/Tool/rpmutils.py 2013/03/03 09:48:35 garyo" + + +import platform + +# Start of rpmrc dictionaries (Marker, don't change or remove!) +os_canon = { + 'AIX' : ['AIX','5'], + 'AmigaOS' : ['AmigaOS','5'], + 'BSD_OS' : ['bsdi','12'], + 'CYGWIN32_95' : ['cygwin32','15'], + 'CYGWIN32_NT' : ['cygwin32','14'], + 'Darwin' : ['darwin','21'], + 'FreeBSD' : ['FreeBSD','8'], + 'HP-UX' : ['hpux10','6'], + 'IRIX' : ['Irix','2'], + 'IRIX64' : ['Irix64','10'], + 'Linux' : ['Linux','1'], + 'Linux/390' : ['OS/390','20'], + 'Linux/ESA' : ['VM/ESA','20'], + 'MacOSX' : ['macosx','21'], + 'MiNT' : ['FreeMiNT','17'], + 'NEXTSTEP' : ['NextStep','11'], + 'OS/390' : ['OS/390','18'], + 'OSF1' : ['osf1','7'], + 'SCO_SV' : ['SCO_SV3.2v5.0.2','9'], + 'SunOS4' : ['SunOS','4'], + 'SunOS5' : ['solaris','3'], + 'UNIX_SV' : ['MP_RAS','16'], + 'VM/ESA' : ['VM/ESA','19'], + 'machten' : ['machten','13'], + 'osf3.2' : ['osf1','7'], + 'osf4.0' : ['osf1','7'], +} + +buildarch_compat = { + 'alpha' : ['noarch'], + 'alphaev5' : ['alpha'], + 'alphaev56' : ['alphaev5'], + 'alphaev6' : ['alphapca56'], + 'alphaev67' : ['alphaev6'], + 'alphapca56' : ['alphaev56'], + 'amd64' : ['x86_64'], + 'armv3l' : ['noarch'], + 'armv4b' : ['noarch'], + 'armv4l' : ['armv3l'], + 'armv4tl' : ['armv4l'], + 'armv5tejl' : ['armv5tel'], + 'armv5tel' : ['armv4tl'], + 'armv6l' : ['armv5tejl'], + 'armv7l' : ['armv6l'], + 'atariclone' : ['m68kmint','noarch'], + 'atarist' : ['m68kmint','noarch'], + 'atariste' : ['m68kmint','noarch'], + 'ataritt' : ['m68kmint','noarch'], + 'athlon' : ['i686'], + 'falcon' : ['m68kmint','noarch'], + 'geode' : ['i586'], + 'hades' : ['m68kmint','noarch'], + 'hppa1.0' : ['parisc'], + 'hppa1.1' : ['hppa1.0'], + 'hppa1.2' : ['hppa1.1'], + 'hppa2.0' : ['hppa1.2'], + 'i386' : ['noarch','fat'], + 'i486' : ['i386'], + 'i586' : ['i486'], + 'i686' : ['i586'], + 'ia32e' : ['x86_64'], + 'ia64' : ['noarch'], + 'm68k' : ['noarch'], + 'milan' : ['m68kmint','noarch'], + 'mips' : ['noarch'], + 'mipsel' : ['noarch'], + 'parisc' : ['noarch'], + 'pentium3' : ['i686'], + 'pentium4' : ['pentium3'], + 'ppc' : ['noarch','fat'], + 'ppc32dy4' : ['noarch'], + 'ppc64' : ['noarch','fat'], + 'ppc64iseries' : ['ppc64'], + 'ppc64pseries' : ['ppc64'], + 'ppc8260' : ['noarch'], + 'ppc8560' : ['noarch'], + 'ppciseries' : ['noarch'], + 'ppcpseries' : ['noarch'], + 's390' : ['noarch'], + 's390x' : ['noarch'], + 'sh3' : ['noarch'], + 'sh4' : ['noarch'], + 'sh4a' : ['sh4'], + 'sparc' : ['noarch'], + 'sparc64' : ['sparcv9v'], + 'sparc64v' : ['sparc64'], + 'sparcv8' : ['sparc'], + 'sparcv9' : ['sparcv8'], + 'sparcv9v' : ['sparcv9'], + 'sun4c' : ['noarch'], + 'sun4d' : ['noarch'], + 'sun4m' : ['noarch'], + 'sun4u' : ['noarch'], + 'x86_64' : ['noarch'], +} + +os_compat = { + 'BSD_OS' : ['bsdi'], + 'Darwin' : ['MacOSX'], + 'FreeMiNT' : ['mint','MiNT','TOS'], + 'IRIX64' : ['IRIX'], + 'MiNT' : ['FreeMiNT','mint','TOS'], + 'TOS' : ['FreeMiNT','MiNT','mint'], + 'bsdi4.0' : ['bsdi'], + 'hpux10.00' : ['hpux9.07'], + 'hpux10.01' : ['hpux10.00'], + 'hpux10.10' : ['hpux10.01'], + 'hpux10.20' : ['hpux10.10'], + 'hpux10.30' : ['hpux10.20'], + 'hpux11.00' : ['hpux10.30'], + 'hpux9.05' : ['hpux9.04'], + 'hpux9.07' : ['hpux9.05'], + 'mint' : ['FreeMiNT','MiNT','TOS'], + 'ncr-sysv4.3' : ['ncr-sysv4.2'], + 'osf4.0' : ['osf3.2','osf1'], + 'solaris2.4' : ['solaris2.3'], + 'solaris2.5' : ['solaris2.3','solaris2.4'], + 'solaris2.6' : ['solaris2.3','solaris2.4','solaris2.5'], + 'solaris2.7' : ['solaris2.3','solaris2.4','solaris2.5','solaris2.6'], +} + +arch_compat = { + 'alpha' : ['axp','noarch'], + 'alphaev5' : ['alpha'], + 'alphaev56' : ['alphaev5'], + 'alphaev6' : ['alphapca56'], + 'alphaev67' : ['alphaev6'], + 'alphapca56' : ['alphaev56'], + 'amd64' : ['x86_64','athlon','noarch'], + 'armv3l' : ['noarch'], + 'armv4b' : ['noarch'], + 'armv4l' : ['armv3l'], + 'armv4tl' : ['armv4l'], + 'armv5tejl' : ['armv5tel'], + 'armv5tel' : ['armv4tl'], + 'armv6l' : ['armv5tejl'], + 'armv7l' : ['armv6l'], + 'atariclone' : ['m68kmint','noarch'], + 'atarist' : ['m68kmint','noarch'], + 'atariste' : ['m68kmint','noarch'], + 'ataritt' : ['m68kmint','noarch'], + 'athlon' : ['i686'], + 'falcon' : ['m68kmint','noarch'], + 'geode' : ['i586'], + 'hades' : ['m68kmint','noarch'], + 'hppa1.0' : ['parisc'], + 'hppa1.1' : ['hppa1.0'], + 'hppa1.2' : ['hppa1.1'], + 'hppa2.0' : ['hppa1.2'], + 'i370' : ['noarch'], + 'i386' : ['noarch','fat'], + 'i486' : ['i386'], + 'i586' : ['i486'], + 'i686' : ['i586'], + 'ia32e' : ['x86_64','athlon','noarch'], + 'ia64' : ['noarch'], + 'milan' : ['m68kmint','noarch'], + 'mips' : ['noarch'], + 'mipsel' : ['noarch'], + 'osfmach3_i386' : ['i486'], + 'osfmach3_i486' : ['i486','osfmach3_i386'], + 'osfmach3_i586' : ['i586','osfmach3_i486'], + 'osfmach3_i686' : ['i686','osfmach3_i586'], + 'osfmach3_ppc' : ['ppc'], + 'parisc' : ['noarch'], + 'pentium3' : ['i686'], + 'pentium4' : ['pentium3'], + 'powerpc' : ['ppc'], + 'powerppc' : ['ppc'], + 'ppc' : ['rs6000'], + 'ppc32dy4' : ['ppc'], + 'ppc64' : ['ppc'], + 'ppc64iseries' : ['ppc64'], + 'ppc64pseries' : ['ppc64'], + 'ppc8260' : ['ppc'], + 'ppc8560' : ['ppc'], + 'ppciseries' : ['ppc'], + 'ppcpseries' : ['ppc'], + 'rs6000' : ['noarch','fat'], + 's390' : ['noarch'], + 's390x' : ['s390','noarch'], + 'sh3' : ['noarch'], + 'sh4' : ['noarch'], + 'sh4a' : ['sh4'], + 'sparc' : ['noarch'], + 'sparc64' : ['sparcv9'], + 'sparc64v' : ['sparc64'], + 'sparcv8' : ['sparc'], + 'sparcv9' : ['sparcv8'], + 'sparcv9v' : ['sparcv9'], + 'sun4c' : ['sparc'], + 'sun4d' : ['sparc'], + 'sun4m' : ['sparc'], + 'sun4u' : ['sparc64'], + 'x86_64' : ['amd64','athlon','noarch'], +} + +buildarchtranslate = { + 'alphaev5' : ['alpha'], + 'alphaev56' : ['alpha'], + 'alphaev6' : ['alpha'], + 'alphaev67' : ['alpha'], + 'alphapca56' : ['alpha'], + 'amd64' : ['x86_64'], + 'armv3l' : ['armv3l'], + 'armv4b' : ['armv4b'], + 'armv4l' : ['armv4l'], + 'armv4tl' : ['armv4tl'], + 'armv5tejl' : ['armv5tejl'], + 'armv5tel' : ['armv5tel'], + 'armv6l' : ['armv6l'], + 'armv7l' : ['armv7l'], + 'atariclone' : ['m68kmint'], + 'atarist' : ['m68kmint'], + 'atariste' : ['m68kmint'], + 'ataritt' : ['m68kmint'], + 'athlon' : ['i386'], + 'falcon' : ['m68kmint'], + 'geode' : ['i386'], + 'hades' : ['m68kmint'], + 'i386' : ['i386'], + 'i486' : ['i386'], + 'i586' : ['i386'], + 'i686' : ['i386'], + 'ia32e' : ['x86_64'], + 'ia64' : ['ia64'], + 'milan' : ['m68kmint'], + 'osfmach3_i386' : ['i386'], + 'osfmach3_i486' : ['i386'], + 'osfmach3_i586' : ['i386'], + 'osfmach3_i686' : ['i386'], + 'osfmach3_ppc' : ['ppc'], + 'pentium3' : ['i386'], + 'pentium4' : ['i386'], + 'powerpc' : ['ppc'], + 'powerppc' : ['ppc'], + 'ppc32dy4' : ['ppc'], + 'ppc64iseries' : ['ppc64'], + 'ppc64pseries' : ['ppc64'], + 'ppc8260' : ['ppc'], + 'ppc8560' : ['ppc'], + 'ppciseries' : ['ppc'], + 'ppcpseries' : ['ppc'], + 's390' : ['s390'], + 's390x' : ['s390x'], + 'sh3' : ['sh3'], + 'sh4' : ['sh4'], + 'sh4a' : ['sh4'], + 'sparc64v' : ['sparc64'], + 'sparcv8' : ['sparc'], + 'sparcv9' : ['sparc'], + 'sparcv9v' : ['sparc'], + 'sun4c' : ['sparc'], + 'sun4d' : ['sparc'], + 'sun4m' : ['sparc'], + 'sun4u' : ['sparc64'], + 'x86_64' : ['x86_64'], +} + +optflags = { + 'alpha' : ['-O2','-g','-mieee'], + 'alphaev5' : ['-O2','-g','-mieee','-mtune=ev5'], + 'alphaev56' : ['-O2','-g','-mieee','-mtune=ev56'], + 'alphaev6' : ['-O2','-g','-mieee','-mtune=ev6'], + 'alphaev67' : ['-O2','-g','-mieee','-mtune=ev67'], + 'alphapca56' : ['-O2','-g','-mieee','-mtune=pca56'], + 'amd64' : ['-O2','-g'], + 'armv3l' : ['-O2','-g','-march=armv3'], + 'armv4b' : ['-O2','-g','-march=armv4'], + 'armv4l' : ['-O2','-g','-march=armv4'], + 'armv4tl' : ['-O2','-g','-march=armv4t'], + 'armv5tejl' : ['-O2','-g','-march=armv5te'], + 'armv5tel' : ['-O2','-g','-march=armv5te'], + 'armv6l' : ['-O2','-g','-march=armv6'], + 'armv7l' : ['-O2','-g','-march=armv7'], + 'atariclone' : ['-O2','-g','-fomit-frame-pointer'], + 'atarist' : ['-O2','-g','-fomit-frame-pointer'], + 'atariste' : ['-O2','-g','-fomit-frame-pointer'], + 'ataritt' : ['-O2','-g','-fomit-frame-pointer'], + 'athlon' : ['-O2','-g','-march=athlon'], + 'falcon' : ['-O2','-g','-fomit-frame-pointer'], + 'fat' : ['-O2','-g','-arch','i386','-arch','ppc'], + 'geode' : ['-Os','-g','-m32','-march=geode'], + 'hades' : ['-O2','-g','-fomit-frame-pointer'], + 'hppa1.0' : ['-O2','-g','-mpa-risc-1-0'], + 'hppa1.1' : ['-O2','-g','-mpa-risc-1-0'], + 'hppa1.2' : ['-O2','-g','-mpa-risc-1-0'], + 'hppa2.0' : ['-O2','-g','-mpa-risc-1-0'], + 'i386' : ['-O2','-g','-march=i386','-mtune=i686'], + 'i486' : ['-O2','-g','-march=i486'], + 'i586' : ['-O2','-g','-march=i586'], + 'i686' : ['-O2','-g','-march=i686'], + 'ia32e' : ['-O2','-g'], + 'ia64' : ['-O2','-g'], + 'm68k' : ['-O2','-g','-fomit-frame-pointer'], + 'milan' : ['-O2','-g','-fomit-frame-pointer'], + 'mips' : ['-O2','-g'], + 'mipsel' : ['-O2','-g'], + 'parisc' : ['-O2','-g','-mpa-risc-1-0'], + 'pentium3' : ['-O2','-g','-march=pentium3'], + 'pentium4' : ['-O2','-g','-march=pentium4'], + 'ppc' : ['-O2','-g','-fsigned-char'], + 'ppc32dy4' : ['-O2','-g','-fsigned-char'], + 'ppc64' : ['-O2','-g','-fsigned-char'], + 'ppc8260' : ['-O2','-g','-fsigned-char'], + 'ppc8560' : ['-O2','-g','-fsigned-char'], + 'ppciseries' : ['-O2','-g','-fsigned-char'], + 'ppcpseries' : ['-O2','-g','-fsigned-char'], + 's390' : ['-O2','-g'], + 's390x' : ['-O2','-g'], + 'sh3' : ['-O2','-g'], + 'sh4' : ['-O2','-g','-mieee'], + 'sh4a' : ['-O2','-g','-mieee'], + 'sparc' : ['-O2','-g','-m32','-mtune=ultrasparc'], + 'sparc64' : ['-O2','-g','-m64','-mtune=ultrasparc'], + 'sparc64v' : ['-O2','-g','-m64','-mtune=niagara'], + 'sparcv8' : ['-O2','-g','-m32','-mtune=ultrasparc','-mv8'], + 'sparcv9' : ['-O2','-g','-m32','-mtune=ultrasparc'], + 'sparcv9v' : ['-O2','-g','-m32','-mtune=niagara'], + 'x86_64' : ['-O2','-g'], +} + +arch_canon = { + 'IP' : ['sgi','7'], + 'alpha' : ['alpha','2'], + 'alphaev5' : ['alphaev5','2'], + 'alphaev56' : ['alphaev56','2'], + 'alphaev6' : ['alphaev6','2'], + 'alphaev67' : ['alphaev67','2'], + 'alphapca56' : ['alphapca56','2'], + 'amd64' : ['amd64','1'], + 'armv3l' : ['armv3l','12'], + 'armv4b' : ['armv4b','12'], + 'armv4l' : ['armv4l','12'], + 'armv5tejl' : ['armv5tejl','12'], + 'armv5tel' : ['armv5tel','12'], + 'armv6l' : ['armv6l','12'], + 'armv7l' : ['armv7l','12'], + 'atariclone' : ['m68kmint','13'], + 'atarist' : ['m68kmint','13'], + 'atariste' : ['m68kmint','13'], + 'ataritt' : ['m68kmint','13'], + 'athlon' : ['athlon','1'], + 'falcon' : ['m68kmint','13'], + 'geode' : ['geode','1'], + 'hades' : ['m68kmint','13'], + 'i370' : ['i370','14'], + 'i386' : ['i386','1'], + 'i486' : ['i486','1'], + 'i586' : ['i586','1'], + 'i686' : ['i686','1'], + 'ia32e' : ['ia32e','1'], + 'ia64' : ['ia64','9'], + 'm68k' : ['m68k','6'], + 'm68kmint' : ['m68kmint','13'], + 'milan' : ['m68kmint','13'], + 'mips' : ['mips','4'], + 'mipsel' : ['mipsel','11'], + 'pentium3' : ['pentium3','1'], + 'pentium4' : ['pentium4','1'], + 'ppc' : ['ppc','5'], + 'ppc32dy4' : ['ppc32dy4','5'], + 'ppc64' : ['ppc64','16'], + 'ppc64iseries' : ['ppc64iseries','16'], + 'ppc64pseries' : ['ppc64pseries','16'], + 'ppc8260' : ['ppc8260','5'], + 'ppc8560' : ['ppc8560','5'], + 'ppciseries' : ['ppciseries','5'], + 'ppcpseries' : ['ppcpseries','5'], + 'rs6000' : ['rs6000','8'], + 's390' : ['s390','14'], + 's390x' : ['s390x','15'], + 'sh' : ['sh','17'], + 'sh3' : ['sh3','17'], + 'sh4' : ['sh4','17'], + 'sh4a' : ['sh4a','17'], + 'sparc' : ['sparc','3'], + 'sparc64' : ['sparc64','2'], + 'sparc64v' : ['sparc64v','2'], + 'sparcv8' : ['sparcv8','3'], + 'sparcv9' : ['sparcv9','3'], + 'sparcv9v' : ['sparcv9v','3'], + 'sun4' : ['sparc','3'], + 'sun4c' : ['sparc','3'], + 'sun4d' : ['sparc','3'], + 'sun4m' : ['sparc','3'], + 'sun4u' : ['sparc64','2'], + 'x86_64' : ['x86_64','1'], + 'xtensa' : ['xtensa','18'], +} + +# End of rpmrc dictionaries (Marker, don't change or remove!) + +def defaultMachine(): + """ Return the canonicalized machine name. """ + rmachine = platform.machine() + + # Try to lookup the string in the canon table + if rmachine in arch_canon: + rmachine = arch_canon[rmachine][0] + + return rmachine + +def defaultSystem(): + """ Return the canonicalized system name. """ + rsystem = platform.system() + + # Try to lookup the string in the canon tables + if rsystem in os_canon: + rsystem = os_canon[rsystem][0] + + return rsystem + +def defaultNames(): + """ Return the canonicalized machine and system name. """ + return defaultMachine(), defaultSystem() + +def updateRpmDicts(rpmrc, pyfile): + """ Read the given rpmrc file with RPM definitions and update the + info dictionaries in the file pyfile with it. + The arguments will usually be 'rpmrc.in' from a recent RPM source + tree, and 'rpmutils.py' referring to this script itself. + See also usage() below. + """ + try: + # Read old rpmutils.py file + oldpy = open(pyfile,"r").readlines() + # Read current rpmrc.in file + rpm = open(rpmrc,"r").readlines() + # Parse for data + data = {} + # Allowed section names that get parsed + sections = ['optflags', + 'arch_canon', + 'os_canon', + 'buildarchtranslate', + 'arch_compat', + 'os_compat', + 'buildarch_compat'] + for l in rpm: + l = l.rstrip('\n').replace(':',' ') + # Skip comments + if l.lstrip().startswith('#'): + continue + tokens = l.strip().split() + if len(tokens): + key = tokens[0] + if key in sections: + # Have we met this section before? + if not data.has_key(tokens[0]): + # No, so insert it + data[key] = {} + # Insert data + data[key][tokens[1]] = tokens[2:] + # Write new rpmutils.py file + out = open(pyfile,"w") + pm = 0 + for l in oldpy: + if pm: + if l.startswith('# End of rpmrc dictionaries'): + pm = 0 + out.write(l) + else: + out.write(l) + if l.startswith('# Start of rpmrc dictionaries'): + pm = 1 + # Write data sections to single dictionaries + for key, entries in data.iteritems(): + out.write("%s = {\n" % key) + for arch in sorted(entries.keys()): + out.write(" '%s' : ['%s'],\n" % (arch, "','".join(entries[arch]))) + out.write("}\n\n") + out.close() + except: + pass + +def usage(): + print "rpmutils.py rpmrc.in rpmutils.py" + +def main(): + import sys + + if len(sys.argv) < 3: + usage() + sys.exit(0) + updateRpmDicts(sys.argv[1], sys.argv[2]) + +if __name__ == "__main__": + main() diff --git a/scons/scons-local-2.2.0/SCons/Tool/sgiar.py b/scons/scons-local-2.3.0/SCons/Tool/sgiar.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/sgiar.py rename to scons/scons-local-2.3.0/SCons/Tool/sgiar.py index 42d07a2ed..27f5f7544 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sgiar.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sgiar.py @@ -11,7 +11,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -33,7 +33,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sgiar.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sgiar.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/sgic++.py b/scons/scons-local-2.3.0/SCons/Tool/sgic++.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/sgic++.py rename to scons/scons-local-2.3.0/SCons/Tool/sgic++.py index 5358c4b66..ae2ac2c4b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sgic++.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sgic++.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sgic++.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sgic++.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/sgicc.py b/scons/scons-local-2.3.0/SCons/Tool/sgicc.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/sgicc.py rename to scons/scons-local-2.3.0/SCons/Tool/sgicc.py index c69d4fc9e..54e05a31b 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sgicc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sgicc.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sgicc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sgicc.py 2013/03/03 09:48:35 garyo" import cc diff --git a/scons/scons-local-2.2.0/SCons/Tool/sgilink.py b/scons/scons-local-2.3.0/SCons/Tool/sgilink.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/sgilink.py rename to scons/scons-local-2.3.0/SCons/Tool/sgilink.py index f65144697..82c44193e 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sgilink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sgilink.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sgilink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sgilink.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/sunar.py b/scons/scons-local-2.3.0/SCons/Tool/sunar.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/sunar.py rename to scons/scons-local-2.3.0/SCons/Tool/sunar.py index 6e5f235f7..3a4d7c2dc 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sunar.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sunar.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sunar.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sunar.py 2013/03/03 09:48:35 garyo" import SCons.Defaults import SCons.Tool diff --git a/scons/scons-local-2.2.0/SCons/Tool/sunc++.py b/scons/scons-local-2.3.0/SCons/Tool/sunc++.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Tool/sunc++.py rename to scons/scons-local-2.3.0/SCons/Tool/sunc++.py index 6effe32f8..7234239e0 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sunc++.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sunc++.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sunc++.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sunc++.py 2013/03/03 09:48:35 garyo" import SCons diff --git a/scons/scons-local-2.2.0/SCons/Tool/suncc.py b/scons/scons-local-2.3.0/SCons/Tool/suncc.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/suncc.py rename to scons/scons-local-2.3.0/SCons/Tool/suncc.py index 6b1461f85..f7442d8bd 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/suncc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/suncc.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/suncc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/suncc.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/sunf77.py b/scons/scons-local-2.3.0/SCons/Tool/sunf77.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/sunf77.py rename to scons/scons-local-2.3.0/SCons/Tool/sunf77.py index 1536c7126..eb6378156 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sunf77.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sunf77.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sunf77.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sunf77.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/sunf90.py b/scons/scons-local-2.3.0/SCons/Tool/sunf90.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/sunf90.py rename to scons/scons-local-2.3.0/SCons/Tool/sunf90.py index 65417f153..cfee2ee7c 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sunf90.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sunf90.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sunf90.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sunf90.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/sunf95.py b/scons/scons-local-2.3.0/SCons/Tool/sunf95.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/sunf95.py rename to scons/scons-local-2.3.0/SCons/Tool/sunf95.py index c5300ad3b..31d57b11e 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sunf95.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sunf95.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sunf95.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sunf95.py 2013/03/03 09:48:35 garyo" import SCons.Util diff --git a/scons/scons-local-2.2.0/SCons/Tool/sunlink.py b/scons/scons-local-2.3.0/SCons/Tool/sunlink.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/Tool/sunlink.py rename to scons/scons-local-2.3.0/SCons/Tool/sunlink.py index b747c8f2e..46393417e 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/sunlink.py +++ b/scons/scons-local-2.3.0/SCons/Tool/sunlink.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/sunlink.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/sunlink.py 2013/03/03 09:48:35 garyo" import os import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/swig.py b/scons/scons-local-2.3.0/SCons/Tool/swig.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/swig.py rename to scons/scons-local-2.3.0/SCons/Tool/swig.py index 9f2a3800d..6bbe922cb 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/swig.py +++ b/scons/scons-local-2.3.0/SCons/Tool/swig.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/swig.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/swig.py 2013/03/03 09:48:35 garyo" import os.path import re diff --git a/scons/scons-local-2.2.0/SCons/Tool/tar.py b/scons/scons-local-2.3.0/SCons/Tool/tar.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Tool/tar.py rename to scons/scons-local-2.3.0/SCons/Tool/tar.py index 7cb9836b4..e28935839 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/tar.py +++ b/scons/scons-local-2.3.0/SCons/Tool/tar.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/tar.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/tar.py 2013/03/03 09:48:35 garyo" import SCons.Action import SCons.Builder diff --git a/scons/scons-local-2.2.0/SCons/Tool/tex.py b/scons/scons-local-2.3.0/SCons/Tool/tex.py similarity index 90% rename from scons/scons-local-2.2.0/SCons/Tool/tex.py rename to scons/scons-local-2.3.0/SCons/Tool/tex.py index ce394e4f5..59606348c 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/tex.py +++ b/scons/scons-local-2.3.0/SCons/Tool/tex.py @@ -10,7 +10,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/tex.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/tex.py 2013/03/03 09:48:35 garyo" import os.path import re @@ -100,6 +100,10 @@ makeglossary_re = re.compile(r"^[^%\n]*\\makeglossary", re.MULTILINE) makeglossaries_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE) makeacronyms_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE) beamer_re = re.compile(r"^[^%\n]*\\documentclass\{beamer\}", re.MULTILINE) +regex = r'^[^%\n]*\\newglossary\s*\[([^\]]+)\]?\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}' +newglossary_re = re.compile(regex, re.MULTILINE) + +newglossary_suffix = [] # search to find all files included by Latex include_re = re.compile(r'^[^%\n]*\\(?:include|input){([^}]*)}', re.MULTILINE) @@ -125,6 +129,9 @@ LaTeXAction = None # An action to run BibTeX on a file. BibTeXAction = None +# An action to run Biber on a file. +BiberAction = None + # An action to run MakeIndex on a file. MakeIndexAction = None @@ -137,6 +144,9 @@ MakeGlossaryAction = None # An action to run MakeIndex (for acronyms) on a file. MakeAcronymsAction = None +# An action to run MakeIndex (for newglossary commands) on a file. +MakeNewGlossaryAction = None + # Used as a return value of modify_env_var if the variable is not set. _null = SCons.Scanner.LaTeX._null @@ -232,7 +242,8 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None saved_hashes = {} suffix_nodes = {} - for suffix in all_suffixes: + + for suffix in all_suffixes+sum(newglossary_suffix, []): theNode = env.fs.File(targetbase + suffix) suffix_nodes[suffix] = theNode saved_hashes[suffix] = theNode.get_csig() @@ -336,7 +347,9 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None must_rerun_latex = True # Now decide if biber will need to be run. - # The information that bibtex reads from the .bcf file is + # When the backend for biblatex is biber (by choice or default) the + # citation information is put in the .bcf file. + # The information that biber reads from the .bcf file is # pass-independent. If we find (below) that the .bbl file is unchanged, # then the last latex saw a correct bibliography. # Therefore only do this once @@ -349,11 +362,11 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None content = open(target_bcf, "rb").read() if content.find("bibdata") != -1: if Verbose: - print "Need to run bibtex on ",bcffilename + print "Need to run biber on ",bcffilename bibfile = env.fs.File(SCons.Util.splitext(target_bcf)[0]) - result = BibTeXAction(bibfile, bibfile, env) + result = BiberAction(bibfile, bibfile, env) if result != 0: - check_file_error_message(env['BIBTEX'], 'blg') + check_file_error_message(env['BIBER'], 'blg') must_rerun_latex = True # Now decide if latex will need to be run again due to index. @@ -410,6 +423,21 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None 'alg') return result + # Now decide if latex will need to be run again due to newglossary command. + for ig in range(len(newglossary_suffix)): + if check_MD5(suffix_nodes[newglossary_suffix[ig][2]],newglossary_suffix[ig][2]) or (count == 1): + # We must run makeindex + if Verbose: + print "Need to run makeindex for newglossary" + newglfile = suffix_nodes[newglossary_suffix[ig][2]] + MakeNewGlossaryAction = SCons.Action.Action("$MAKENEWGLOSSARY ${SOURCE.filebase}%s -s ${SOURCE.filebase}.ist -t ${SOURCE.filebase}%s -o ${SOURCE.filebase}%s" % (newglossary_suffix[ig][2],newglossary_suffix[ig][0],newglossary_suffix[ig][1]), "$MAKENEWGLOSSARYCOMSTR") + + result = MakeNewGlossaryAction(newglfile, newglfile, env) + if result != 0: + check_file_error_message('%s (newglossary)' % env['MAKENEWGLOSSARY'], + newglossary_suffix[ig][0]) + return result + # Now decide if latex needs to be run yet again to resolve warnings. if warning_rerun_re.search(logContent): must_rerun_latex = True @@ -595,9 +623,23 @@ def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphi for i in range(len(file_tests_search)): if file_tests[i][0] is None: + if Verbose: + print "scan i ",i," files_tests[i] ",file_tests[i], file_tests[i][1] file_tests[i][0] = file_tests_search[i].search(content) if Verbose and file_tests[i][0]: - print " found match for ",file_tests[i][-1][-1] + print " found match for ",file_tests[i][1][-1] + # for newglossary insert the suffixes in file_tests[i] + if file_tests[i][0] and file_tests[i][1][-1] == 'newglossary': + findresult = file_tests_search[i].findall(content) + for l in range(len(findresult)) : + (file_tests[i][1]).insert(0,'.'+findresult[l][3]) + (file_tests[i][1]).insert(0,'.'+findresult[l][2]) + (file_tests[i][1]).insert(0,'.'+findresult[l][0]) + suffix_list = ['.'+findresult[l][0],'.'+findresult[l][2],'.'+findresult[l][3] ] + newglossary_suffix.append(suffix_list) + if Verbose: + print " new suffixes for newglossary ",newglossary_suffix + incResult = includeOnly_re.search(content) if incResult: @@ -676,7 +718,8 @@ def tex_emitter_core(target, source, env, graphics_extensions): makeglossary_re, makeglossaries_re, makeacronyms_re, - beamer_re ] + beamer_re, + newglossary_re ] # set up list with the file suffixes that need emitting # when a feature is found file_tests_suff = [['.aux','aux_file'], @@ -693,7 +736,9 @@ def tex_emitter_core(target, source, env, graphics_extensions): ['.glo', '.gls', '.glg','glossary'], ['.glo', '.gls', '.glg','glossaries'], ['.acn', '.acr', '.alg','acronyms'], - ['.nav', '.snm', '.out', '.toc','beamer'] ] + ['.nav', '.snm', '.out', '.toc','beamer'], + ['newglossary',] ] + # for newglossary the suffixes are added as we find the command # build the list of lists file_tests = [] for i in range(len(file_tests_search)): @@ -722,6 +767,7 @@ def tex_emitter_core(target, source, env, graphics_extensions): if Verbose: print "search path ",paths + # scan all sources for side effect files aux_files = [] file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files) @@ -839,6 +885,11 @@ def generate_common(env): if BibTeXAction is None: BibTeXAction = SCons.Action.Action("$BIBTEXCOM", "$BIBTEXCOMSTR") + # Define an action to run Biber on a file. + global BiberAction + if BiberAction is None: + BiberAction = SCons.Action.Action("$BIBERCOM", "$BIBERCOMSTR") + # Define an action to run MakeIndex on a file. global MakeIndexAction if MakeIndexAction is None: @@ -898,6 +949,10 @@ def generate_common(env): env['BIBTEXFLAGS'] = SCons.Util.CLVar('') env['BIBTEXCOM'] = CDCOM + '${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}' + env['BIBER'] = 'biber' + env['BIBERFLAGS'] = SCons.Util.CLVar('') + env['BIBERCOM'] = CDCOM + '${TARGET.dir} && $BIBER $BIBERFLAGS ${SOURCE.filebase}' + env['MAKEINDEX'] = 'makeindex' env['MAKEINDEXFLAGS'] = SCons.Util.CLVar('') env['MAKEINDEXCOM'] = CDCOM + '${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}' @@ -917,6 +972,9 @@ def generate_common(env): env['MAKENCLFLAGS'] = '-s ${MAKENCLSTYLE} -t ${SOURCE.filebase}.nlg' env['MAKENCLCOM'] = CDCOM + '${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls' + env['MAKENEWGLOSSARY'] = 'makeindex' + env['MAKENEWGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKENEWGLOSSARY ' + def exists(env): generate_darwin(env) return env.Detect('tex') diff --git a/scons/scons-local-2.2.0/SCons/Tool/textfile.py b/scons/scons-local-2.3.0/SCons/Tool/textfile.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/textfile.py rename to scons/scons-local-2.3.0/SCons/Tool/textfile.py index 44fd99941..5e8307bf0 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/textfile.py +++ b/scons/scons-local-2.3.0/SCons/Tool/textfile.py @@ -1,6 +1,6 @@ # -*- python -*- # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -44,7 +44,7 @@ Textfile/Substfile builder for SCons. is unpredictible whether the expansion will occur. """ -__revision__ = "src/engine/SCons/Tool/textfile.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/textfile.py 2013/03/03 09:48:35 garyo" import SCons diff --git a/scons/scons-local-2.2.0/SCons/Tool/tlib.py b/scons/scons-local-2.3.0/SCons/Tool/tlib.py similarity index 92% rename from scons/scons-local-2.2.0/SCons/Tool/tlib.py rename to scons/scons-local-2.3.0/SCons/Tool/tlib.py index 5a24a0cf2..5a30712ff 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/tlib.py +++ b/scons/scons-local-2.3.0/SCons/Tool/tlib.py @@ -5,7 +5,7 @@ XXX """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ XXX # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/tlib.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/tlib.py 2013/03/03 09:48:35 garyo" import SCons.Tool import SCons.Tool.bcc32 diff --git a/scons/scons-local-2.2.0/SCons/Tool/wix.py b/scons/scons-local-2.3.0/SCons/Tool/wix.py similarity index 76% rename from scons/scons-local-2.2.0/SCons/Tool/wix.py rename to scons/scons-local-2.3.0/SCons/Tool/wix.py index eb88ce383..5b4c606bf 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/wix.py +++ b/scons/scons-local-2.3.0/SCons/Tool/wix.py @@ -8,7 +8,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/wix.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/wix.py 2013/03/03 09:48:35 garyo" import SCons.Builder import SCons.Action @@ -47,15 +47,17 @@ def generate(env): env['WIXLIGHTFLAGS'].append( '-nologo' ) env['WIXLIGHTCOM'] = "$WIXLIGHT $WIXLIGHTFLAGS -out ${TARGET} ${SOURCES}" + env['WIXSRCSUF'] = '.wxs' + env['WIXOBJSUF'] = '.wixobj' object_builder = SCons.Builder.Builder( action = '$WIXCANDLECOM', - suffix = '.wxiobj', - src_suffix = '.wxs') + suffix = '$WIXOBJSUF', + src_suffix = '$WIXSRCSUF') linker_builder = SCons.Builder.Builder( action = '$WIXLIGHTCOM', - src_suffix = '.wxiobj', + src_suffix = '$WIXOBJSUF', src_builder = object_builder) env['BUILDERS']['WiX'] = linker_builder @@ -66,7 +68,6 @@ def exists(env): # try to find the candle.exe and light.exe tools and # add the install directory to light libpath. - #for path in os.environ['PATH'].split(os.pathsep): for path in os.environ['PATH'].split(os.pathsep): if not path: continue @@ -80,13 +81,17 @@ def exists(env): # search for the tools in the PATH environment variable try: - if env['WIXCANDLE'] in os.listdir(path) and\ - env['WIXLIGHT'] in os.listdir(path): - env.PrependENVPath('PATH', path) - env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ), - '-loc', - os.path.join( path, 'WixUI_en-us.wxl' ) ] - return 1 + files = os.listdir(path) + if env['WIXCANDLE'] in files and env['WIXLIGHT'] in files: + env.PrependENVPath('PATH', path) + # include appropriate flags if running WiX 2.0 + if 'wixui.wixlib' in files and 'WixUI_en-us.wxl' in files: + env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ), + '-loc', + os.path.join( path, 'WixUI_en-us.wxl' ) ] + else: + env['WIXLIGHTFLAGS'] = [] + return 1 except OSError: pass # ignore this, could be a stale PATH entry. diff --git a/scons/scons-local-2.2.0/SCons/Tool/xgettext.py b/scons/scons-local-2.3.0/SCons/Tool/xgettext.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/xgettext.py rename to scons/scons-local-2.3.0/SCons/Tool/xgettext.py index 9a5167c88..6de021ace 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/xgettext.py +++ b/scons/scons-local-2.3.0/SCons/Tool/xgettext.py @@ -3,7 +3,7 @@ Tool specific initialization of `xgettext` tool. """ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -24,7 +24,7 @@ Tool specific initialization of `xgettext` tool. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/xgettext.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/xgettext.py 2013/03/03 09:48:35 garyo" ############################################################################# class _CmdRunner(object): @@ -271,7 +271,10 @@ def generate(env,**kw): import SCons.Util from SCons.Tool.GettextCommon import RPaths, _detect_xgettext - env['XGETTEXT'] = _detect_xgettext(env) + try: + env['XGETTEXT'] = _detect_xgettext(env) + except: + env['XGETTEXT'] = 'xgettext' # NOTE: sources="$SOURCES" would work as well. However, we use following # construction to convert absolute paths provided by scons onto paths # relative to current working dir. Note, that scons expands $SOURCE(S) to @@ -323,7 +326,10 @@ def generate(env,**kw): def exists(env): """ Check, whether the tool exists """ from SCons.Tool.GettextCommon import _xgettext_exists - return _xgettext_exists(env) + try: + return _xgettext_exists(env) + except: + return False ############################################################################# # Local Variables: diff --git a/scons/scons-local-2.2.0/SCons/Tool/yacc.py b/scons/scons-local-2.3.0/SCons/Tool/yacc.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Tool/yacc.py rename to scons/scons-local-2.3.0/SCons/Tool/yacc.py index 580fe76ff..1934181f7 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/yacc.py +++ b/scons/scons-local-2.3.0/SCons/Tool/yacc.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/yacc.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/yacc.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Tool/zip.py b/scons/scons-local-2.3.0/SCons/Tool/zip.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Tool/zip.py rename to scons/scons-local-2.3.0/SCons/Tool/zip.py index 77515ad35..86ae55e16 100644 --- a/scons/scons-local-2.2.0/SCons/Tool/zip.py +++ b/scons/scons-local-2.3.0/SCons/Tool/zip.py @@ -9,7 +9,7 @@ selection method. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Tool/zip.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Tool/zip.py 2013/03/03 09:48:35 garyo" import os.path diff --git a/scons/scons-local-2.2.0/SCons/Util.py b/scons/scons-local-2.3.0/SCons/Util.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/Util.py rename to scons/scons-local-2.3.0/SCons/Util.py index c1f87a2e7..9f66ce099 100644 --- a/scons/scons-local-2.2.0/SCons/Util.py +++ b/scons/scons-local-2.3.0/SCons/Util.py @@ -3,7 +3,7 @@ Various utility functions go here. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -24,7 +24,7 @@ Various utility functions go here. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Util.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Util.py 2013/03/03 09:48:35 garyo" import os import sys diff --git a/scons/scons-local-2.2.0/SCons/Variables/BoolVariable.py b/scons/scons-local-2.3.0/SCons/Variables/BoolVariable.py similarity index 94% rename from scons/scons-local-2.2.0/SCons/Variables/BoolVariable.py rename to scons/scons-local-2.3.0/SCons/Variables/BoolVariable.py index 492f95e32..cdfe3671d 100644 --- a/scons/scons-local-2.2.0/SCons/Variables/BoolVariable.py +++ b/scons/scons-local-2.3.0/SCons/Variables/BoolVariable.py @@ -12,7 +12,7 @@ Usage example: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -34,7 +34,7 @@ Usage example: # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Variables/BoolVariable.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Variables/BoolVariable.py 2013/03/03 09:48:35 garyo" __all__ = ['BoolVariable',] diff --git a/scons/scons-local-2.2.0/SCons/Variables/EnumVariable.py b/scons/scons-local-2.3.0/SCons/Variables/EnumVariable.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Variables/EnumVariable.py rename to scons/scons-local-2.3.0/SCons/Variables/EnumVariable.py index e12c133ce..9e2970f6b 100644 --- a/scons/scons-local-2.2.0/SCons/Variables/EnumVariable.py +++ b/scons/scons-local-2.3.0/SCons/Variables/EnumVariable.py @@ -15,7 +15,7 @@ Usage example: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -37,7 +37,7 @@ Usage example: # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Variables/EnumVariable.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Variables/EnumVariable.py 2013/03/03 09:48:35 garyo" __all__ = ['EnumVariable',] diff --git a/scons/scons-local-2.2.0/SCons/Variables/ListVariable.py b/scons/scons-local-2.3.0/SCons/Variables/ListVariable.py similarity index 96% rename from scons/scons-local-2.2.0/SCons/Variables/ListVariable.py rename to scons/scons-local-2.3.0/SCons/Variables/ListVariable.py index 0763b29c4..735d5257b 100644 --- a/scons/scons-local-2.2.0/SCons/Variables/ListVariable.py +++ b/scons/scons-local-2.3.0/SCons/Variables/ListVariable.py @@ -25,7 +25,7 @@ Usage example: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -46,7 +46,7 @@ Usage example: # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Variables/ListVariable.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Variables/ListVariable.py 2013/03/03 09:48:35 garyo" # Know Bug: This should behave like a Set-Type, but does not really, # since elements can occur twice. diff --git a/scons/scons-local-2.2.0/SCons/Variables/PackageVariable.py b/scons/scons-local-2.3.0/SCons/Variables/PackageVariable.py similarity index 95% rename from scons/scons-local-2.2.0/SCons/Variables/PackageVariable.py rename to scons/scons-local-2.3.0/SCons/Variables/PackageVariable.py index dfac082e4..665692c6c 100644 --- a/scons/scons-local-2.2.0/SCons/Variables/PackageVariable.py +++ b/scons/scons-local-2.3.0/SCons/Variables/PackageVariable.py @@ -28,7 +28,7 @@ Usage example: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -50,7 +50,7 @@ Usage example: # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Variables/PackageVariable.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Variables/PackageVariable.py 2013/03/03 09:48:35 garyo" __all__ = ['PackageVariable',] diff --git a/scons/scons-local-2.2.0/SCons/Variables/PathVariable.py b/scons/scons-local-2.3.0/SCons/Variables/PathVariable.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Variables/PathVariable.py rename to scons/scons-local-2.3.0/SCons/Variables/PathVariable.py index 77ef83eda..b79a7606a 100644 --- a/scons/scons-local-2.2.0/SCons/Variables/PathVariable.py +++ b/scons/scons-local-2.3.0/SCons/Variables/PathVariable.py @@ -46,7 +46,7 @@ Usage example: """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -68,7 +68,7 @@ Usage example: # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/Variables/PathVariable.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Variables/PathVariable.py 2013/03/03 09:48:35 garyo" __all__ = ['PathVariable',] diff --git a/scons/scons-local-2.2.0/SCons/Variables/__init__.py b/scons/scons-local-2.3.0/SCons/Variables/__init__.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/Variables/__init__.py rename to scons/scons-local-2.3.0/SCons/Variables/__init__.py index 88df0218b..3d9d8452a 100644 --- a/scons/scons-local-2.2.0/SCons/Variables/__init__.py +++ b/scons/scons-local-2.3.0/SCons/Variables/__init__.py @@ -5,7 +5,7 @@ customizable variables to an SCons build. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ customizable variables to an SCons build. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Variables/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Variables/__init__.py 2013/03/03 09:48:35 garyo" import os.path import sys diff --git a/scons/scons-local-2.2.0/SCons/Warnings.py b/scons/scons-local-2.3.0/SCons/Warnings.py similarity index 97% rename from scons/scons-local-2.2.0/SCons/Warnings.py rename to scons/scons-local-2.3.0/SCons/Warnings.py index 42e396f88..d7cadc25a 100644 --- a/scons/scons-local-2.2.0/SCons/Warnings.py +++ b/scons/scons-local-2.3.0/SCons/Warnings.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ This file implements the warnings framework for SCons. """ -__revision__ = "src/engine/SCons/Warnings.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/Warnings.py 2013/03/03 09:48:35 garyo" import sys diff --git a/scons/scons-local-2.2.0/SCons/__init__.py b/scons/scons-local-2.3.0/SCons/__init__.py similarity index 83% rename from scons/scons-local-2.2.0/SCons/__init__.py rename to scons/scons-local-2.3.0/SCons/__init__.py index d4b619f71..d1a369f4f 100644 --- a/scons/scons-local-2.2.0/SCons/__init__.py +++ b/scons/scons-local-2.3.0/SCons/__init__.py @@ -5,7 +5,7 @@ The main package for the SCons software construction utility. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,15 +27,15 @@ The main package for the SCons software construction utility. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/__init__.py 2013/03/03 09:48:35 garyo" -__version__ = "2.2.0" +__version__ = "2.3.0" -__build__ = "issue-2856:2676:d23b7a2f45e8[MODIFIED]" +__build__ = "" -__buildsys__ = "oberbrunner-dev" +__buildsys__ = "reepicheep" -__date__ = "2012/08/05 15:38:28" +__date__ = "2013/03/03 09:48:35" __developer__ = "garyo" diff --git a/scons/scons-local-2.2.0/SCons/compat/__init__.py b/scons/scons-local-2.3.0/SCons/compat/__init__.py similarity index 98% rename from scons/scons-local-2.2.0/SCons/compat/__init__.py rename to scons/scons-local-2.3.0/SCons/compat/__init__.py index 7dc6a68d5..56f374259 100644 --- a/scons/scons-local-2.2.0/SCons/compat/__init__.py +++ b/scons/scons-local-2.3.0/SCons/compat/__init__.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -60,7 +60,7 @@ function defined below loads the module as the "real" name (without the rest of our code will find our pre-loaded compatibility module. """ -__revision__ = "src/engine/SCons/compat/__init__.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/compat/__init__.py 2013/03/03 09:48:35 garyo" import os import sys diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_builtins.py b/scons/scons-local-2.3.0/SCons/compat/_scons_builtins.py similarity index 69% rename from scons/scons-local-2.2.0/SCons/compat/_scons_builtins.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_builtins.py index 32f4e7536..1202d46e0 100644 --- a/scons/scons-local-2.2.0/SCons/compat/_scons_builtins.py +++ b/scons/scons-local-2.3.0/SCons/compat/_scons_builtins.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -37,7 +37,6 @@ This module checks for the following builtins names: all() any() - sorted() memoryview() Implementations of functions are *NOT* guaranteed to be fully compliant @@ -52,7 +51,7 @@ the FUNCTIONS or DATA output, that means those names are already built in to this version of Python and we don't need to add them from this module. """ -__revision__ = "src/engine/SCons/compat/_scons_builtins.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/compat/_scons_builtins.py 2013/03/03 09:48:35 garyo" import builtins @@ -101,48 +100,6 @@ except NameError: return self.obj[indx] builtins.memoryview = memoryview -try: - sorted -except NameError: - # Pre-2.4 Python has no sorted() function. - # - # The pre-2.4 Python list.sort() method does not support - # list.sort(key=) nor list.sort(reverse=) keyword arguments, so - # we must implement the functionality of those keyword arguments - # by hand instead of passing them to list.sort(). - def sorted(iterable, cmp=None, key=None, reverse=False): - if key is not None: - result = [(key(x), x) for x in iterable] - else: - result = iterable[:] - if cmp is None: - # Pre-2.3 Python does not support list.sort(None). - result.sort() - else: - result.sort(cmp) - if key is not None: - result = [t1 for t0,t1 in result] - if reverse: - result.reverse() - return result - builtins.sorted = sorted - -#if sys.version_info[:3] in ((2, 2, 0), (2, 2, 1)): -# def lstrip(s, c=string.whitespace): -# while s and s[0] in c: -# s = s[1:] -# return s -# def rstrip(s, c=string.whitespace): -# while s and s[-1] in c: -# s = s[:-1] -# return s -# def strip(s, c=string.whitespace, l=lstrip, r=rstrip): -# return l(r(s, c), c) -# -# object.__setattr__(str, 'lstrip', lstrip) -# object.__setattr__(str, 'rstrip', rstrip) -# object.__setattr__(str, 'strip', strip) - # Local Variables: # tab-width:4 # indent-tabs-mode:nil diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_collections.py b/scons/scons-local-2.3.0/SCons/compat/_scons_collections.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/compat/_scons_collections.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_collections.py index 4687642dd..7cf685ccd 100644 --- a/scons/scons-local-2.2.0/SCons/compat/_scons_collections.py +++ b/scons/scons-local-2.3.0/SCons/compat/_scons_collections.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ used by SCons, in an interface that looks enough like collections for our purposes. """ -__revision__ = "src/engine/SCons/compat/_scons_collections.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/compat/_scons_collections.py 2013/03/03 09:48:35 garyo" # Use exec to hide old names from fixers. exec("""if True: diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_dbm.py b/scons/scons-local-2.3.0/SCons/compat/_scons_dbm.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/compat/_scons_dbm.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_dbm.py index 0506ac804..e6df06341 100644 --- a/scons/scons-local-2.2.0/SCons/compat/_scons_dbm.py +++ b/scons/scons-local-2.3.0/SCons/compat/_scons_dbm.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -30,7 +30,7 @@ that the whichdb.whichdb() implementstation in the various 2.X versions of Python won't blow up even if dbm wasn't compiled in. """ -__revision__ = "src/engine/SCons/compat/_scons_dbm.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/compat/_scons_dbm.py 2013/03/03 09:48:35 garyo" class error(Exception): pass diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_hashlib.py b/scons/scons-local-2.3.0/SCons/compat/_scons_hashlib.py similarity index 93% rename from scons/scons-local-2.2.0/SCons/compat/_scons_hashlib.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_hashlib.py index 52cf3ba60..d4e30232b 100644 --- a/scons/scons-local-2.2.0/SCons/compat/_scons_hashlib.py +++ b/scons/scons-local-2.3.0/SCons/compat/_scons_hashlib.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ purposes, anyway). In fact, this module will raise an ImportError if the underlying md5 module isn't available. """ -__revision__ = "src/engine/SCons/compat/_scons_hashlib.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/compat/_scons_hashlib.py 2013/03/03 09:48:35 garyo" import md5 from string import hexdigits diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_io.py b/scons/scons-local-2.3.0/SCons/compat/_scons_io.py similarity index 91% rename from scons/scons-local-2.2.0/SCons/compat/_scons_io.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_io.py index df4d44497..194029efd 100644 --- a/scons/scons-local-2.2.0/SCons/compat/_scons_io.py +++ b/scons/scons-local-2.3.0/SCons/compat/_scons_io.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -29,7 +29,7 @@ functionality. It only wraps the portions of io functionality used by SCons, in an interface that looks enough like io for our purposes. """ -__revision__ = "src/engine/SCons/compat/_scons_io.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/compat/_scons_io.py 2013/03/03 09:48:35 garyo" # Use the "imp" module to protect the imports below from fixers. import imp diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_sets.py b/scons/scons-local-2.3.0/SCons/compat/_scons_sets.py similarity index 100% rename from scons/scons-local-2.2.0/SCons/compat/_scons_sets.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_sets.py diff --git a/scons/scons-local-2.2.0/SCons/compat/_scons_subprocess.py b/scons/scons-local-2.3.0/SCons/compat/_scons_subprocess.py similarity index 100% rename from scons/scons-local-2.2.0/SCons/compat/_scons_subprocess.py rename to scons/scons-local-2.3.0/SCons/compat/_scons_subprocess.py diff --git a/scons/scons-local-2.2.0/SCons/cpp.py b/scons/scons-local-2.3.0/SCons/cpp.py similarity index 99% rename from scons/scons-local-2.2.0/SCons/cpp.py rename to scons/scons-local-2.3.0/SCons/cpp.py index 74fff7c70..6999292dc 100644 --- a/scons/scons-local-2.2.0/SCons/cpp.py +++ b/scons/scons-local-2.3.0/SCons/cpp.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/cpp.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/cpp.py 2013/03/03 09:48:35 garyo" __doc__ = """ SCons C Pre-Processor module diff --git a/scons/scons-local-2.2.0/SCons/dblite.py b/scons/scons-local-2.3.0/SCons/dblite.py similarity index 100% rename from scons/scons-local-2.2.0/SCons/dblite.py rename to scons/scons-local-2.3.0/SCons/dblite.py diff --git a/scons/scons-local-2.2.0/SCons/exitfuncs.py b/scons/scons-local-2.3.0/SCons/exitfuncs.py similarity index 79% rename from scons/scons-local-2.2.0/SCons/exitfuncs.py rename to scons/scons-local-2.3.0/SCons/exitfuncs.py index 4e604e193..26df1983d 100644 --- a/scons/scons-local-2.2.0/SCons/exitfuncs.py +++ b/scons/scons-local-2.3.0/SCons/exitfuncs.py @@ -5,7 +5,7 @@ Register functions which are executed when SCons exits for any reason. """ # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,9 +27,10 @@ Register functions which are executed when SCons exits for any reason. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "src/engine/SCons/exitfuncs.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/engine/SCons/exitfuncs.py 2013/03/03 09:48:35 garyo" +import atexit _exithandlers = [] def _run_exitfuncs(): @@ -52,23 +53,9 @@ def register(func, *targs, **kargs): """ _exithandlers.append((func, targs, kargs)) -import sys -try: - x = sys.exitfunc - - # if x isn't our own exit func executive, assume it's another - # registered exit function - append it to our list... - if x != _run_exitfuncs: - register(x) - -except AttributeError: - pass - -# make our exit function get run by python when it exits: -sys.exitfunc = _run_exitfuncs - -del sys +# make our exit function get run by python when it exits +atexit.register(_run_exitfuncs) # Local Variables: # tab-width:4 diff --git a/scons/scons-local-2.2.0/scons-2.2.0.egg-info b/scons/scons-local-2.3.0/scons-2.3.0.egg-info similarity index 96% rename from scons/scons-local-2.2.0/scons-2.2.0.egg-info rename to scons/scons-local-2.3.0/scons-2.3.0.egg-info index b8f8d5e88..cd00aa720 100644 --- a/scons/scons-local-2.2.0/scons-2.2.0.egg-info +++ b/scons/scons-local-2.3.0/scons-2.3.0.egg-info @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: scons -Version: 2.2.0 +Version: 2.3.0 Summary: Open Source next-generation build tool. Home-page: http://www.scons.org/ Author: Steven Knight diff --git a/scons/scons-time.py b/scons/scons-time.py index 1d774cb22..2b67410ec 100755 --- a/scons/scons-time.py +++ b/scons/scons-time.py @@ -9,7 +9,7 @@ # # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ from __future__ import division from __future__ import nested_scopes -__revision__ = "src/script/scons-time.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/script/scons-time.py 2013/03/03 09:48:35 garyo" import getopt import glob diff --git a/scons/scons.py b/scons/scons.py index 24686385c..466c72833 100755 --- a/scons/scons.py +++ b/scons/scons.py @@ -2,7 +2,7 @@ # # SCons - a Software Constructor # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -23,15 +23,15 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/script/scons.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/script/scons.py 2013/03/03 09:48:35 garyo" -__version__ = "2.2.0" +__version__ = "2.3.0" -__build__ = "issue-2856:2676:d23b7a2f45e8[MODIFIED]" +__build__ = "" -__buildsys__ = "oberbrunner-dev" +__buildsys__ = "reepicheep" -__date__ = "2012/08/05 15:38:28" +__date__ = "2013/03/03 09:48:35" __developer__ = "garyo" @@ -55,18 +55,12 @@ import sys # engine modules if they're in either directory. -# Check to see if the python version is > 3.0 which is currently unsupported -# If so exit with error message -try: - if sys.version_info >= (3,0,0): - msg = "scons: *** SCons version %s does not run under Python version %s.\n\ -Python 3.0 and later are not yet supported.\n" - sys.stderr.write(msg % (__version__, sys.version.split()[0])) - sys.exit(1) -except AttributeError: - # Pre-1.6 Python has no sys.version_info - # No need to check version as we then know the version is < 3.0.0 and supported - pass +if sys.version_info >= (3,0,0): + msg = "scons: *** SCons version %s does not run under Python version %s.\n\ +Python 3 is not yet supported.\n" + sys.stderr.write(msg % (__version__, sys.version.split()[0])) + sys.exit(1) + script_dir = sys.path[0] @@ -184,7 +178,15 @@ sys.path = libs + sys.path ############################################################################## if __name__ == "__main__": - import SCons.Script + try: + import SCons.Script + except: + ROOT = os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', 'engine') + if os.path.exists(ROOT): + sys.path += [ROOT] + print("SCons import failed. Trying to run from source directory") + import SCons.Script + # this does all the work, and calls sys.exit # with the proper exit status when done. SCons.Script.main() diff --git a/scons/sconsign.py b/scons/sconsign.py index 6e8df4e94..99f0ee83d 100755 --- a/scons/sconsign.py +++ b/scons/sconsign.py @@ -2,7 +2,7 @@ # # SCons - a Software Constructor # -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 The SCons Foundation +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -23,15 +23,15 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/script/sconsign.py issue-2856:2676:d23b7a2f45e8 2012/08/05 15:38:28 garyo" +__revision__ = "src/script/sconsign.py 2013/03/03 09:48:35 garyo" -__version__ = "2.2.0" +__version__ = "2.3.0" -__build__ = "issue-2856:2676:d23b7a2f45e8[MODIFIED]" +__build__ = "" -__buildsys__ = "oberbrunner-dev" +__buildsys__ = "reepicheep" -__date__ = "2012/08/05 15:38:28" +__date__ = "2013/03/03 09:48:35" __developer__ = "garyo" diff --git a/src/agg/agg_renderer.cpp b/src/agg/agg_renderer.cpp index 12684fdac..9f2b2e272 100644 --- a/src/agg/agg_renderer.cpp +++ b/src/agg/agg_renderer.cpp @@ -40,14 +40,14 @@ #include #include #include +#include #include #include #include -// agg -#define AGG_RENDERING_BUFFER row_ptr_cache #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" #include "agg_scanline_u.h" #include "agg_image_filters.h" #include "agg_trans_bilinear.h" @@ -55,7 +55,6 @@ #include "agg_image_accessors.h" #include "agg_span_image_filter_rgba.h" // boost -#include #include #include @@ -79,7 +78,32 @@ agg_renderer::agg_renderer(Map const& m, T & pixmap, double scale_factor, uns font_engine_(), font_manager_(font_engine_), detector_(boost::make_shared(box2d(-m.buffer_size(), -m.buffer_size(), m.width() + m.buffer_size() ,m.height() + m.buffer_size()))), - ras_ptr(new rasterizer) + ras_ptr(new rasterizer), + query_extent_(), + gamma_method_(GAMMA_POWER), + gamma_(1.0) +{ + setup(m); +} + +template +agg_renderer::agg_renderer(Map const& m, request const& req, T & pixmap, double scale_factor, unsigned offset_x, unsigned offset_y) + : feature_style_processor(m, scale_factor), + pixmap_(pixmap), + internal_buffer_(), + current_buffer_(&pixmap), + style_level_compositing_(false), + width_(pixmap_.width()), + height_(pixmap_.height()), + scale_factor_(scale_factor), + t_(req.width(),req.height(),req.extent(),offset_x,offset_y), + font_engine_(), + font_manager_(font_engine_), + detector_(boost::make_shared(box2d(-req.buffer_size(), -req.buffer_size(), req.width() + req.buffer_size() ,req.height() + req.buffer_size()))), + ras_ptr(new rasterizer), + query_extent_(), + gamma_method_(GAMMA_POWER), + gamma_(1.0) { setup(m); } @@ -99,7 +123,10 @@ agg_renderer::agg_renderer(Map const& m, T & pixmap, boost::shared_ptr::end_map_processing(Map const& ) { agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4); - agg::pixfmt_rgba32 pixf(buf); + agg::pixfmt_rgba32_pre pixf(buf); pixf.demultiply(); MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: End map processing"; } @@ -251,13 +278,12 @@ void agg_renderer::end_style_processing(feature_type_style const& st) { composite(pixmap_.data(),current_buffer_->data(), src_over, st.get_opacity(), 0, 0, false); } - - // apply any 'direct' image filters - mapnik::filter::filter_visitor visitor(pixmap_); - BOOST_FOREACH(mapnik::filter::filter_type const& filter_tag, st.direct_image_filters()) - { - boost::apply_visitor(visitor, filter_tag); - } + } + // apply any 'direct' image filters + mapnik::filter::filter_visitor visitor(pixmap_); + BOOST_FOREACH(mapnik::filter::filter_type const& filter_tag, st.direct_image_filters()) + { + boost::apply_visitor(visitor, filter_tag); } MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: End processing style"; } @@ -271,7 +297,6 @@ void agg_renderer::render_marker(pixel_position const& pos, { typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; - typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba blender_type; // comp blender typedef agg::pixfmt_custom_blend_rgba pixfmt_comp_type; typedef agg::renderer_base renderer_base; @@ -279,7 +304,12 @@ void agg_renderer::render_marker(pixel_position const& pos, typedef agg::pod_bvector svg_attribute_type; ras_ptr->reset(); - ras_ptr->gamma(agg::gamma_power()); + 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(), width_, height_, width_ * 4); pixfmt_comp_type pixf(buf); @@ -312,11 +342,10 @@ void agg_renderer::render_marker(pixel_position const& pos, { double width = (*marker.get_bitmap_data())->width(); double height = (*marker.get_bitmap_data())->height(); - double cx = 0.5 * width; - double cy = 0.5 * height; - if (std::fabs(1.0 - scale_factor_) < 0.001 && tr.is_identity()) { + double cx = 0.5 * width; + double cy = 0.5 * height; composite(current_buffer_->data(), **marker.get_bitmap_data(), comp_op, opacity, boost::math::iround(pos.x - cx), @@ -396,7 +425,7 @@ template template void agg_renderer::debug_draw_box(R& buf, box2d const& box, double x, double y, double angle) { - typedef agg::pixfmt_rgba32 pixfmt; + typedef agg::pixfmt_rgba32_pre pixfmt; typedef agg::renderer_base renderer_base; typedef agg::renderer_scanline_aa_solid renderer_type; diff --git a/src/agg/process_building_symbolizer.cpp b/src/agg/process_building_symbolizer.cpp index cd206be03..8b8c8475f 100644 --- a/src/agg/process_building_symbolizer.cpp +++ b/src/agg/process_building_symbolizer.cpp @@ -39,6 +39,7 @@ // agg #include "agg_basics.h" #include "agg_rendering_buffer.h" +#include "agg_color_rgba.h" #include "agg_pixfmt_rgba.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" @@ -54,11 +55,11 @@ void agg_renderer::process(building_symbolizer const& sym, proj_transform const& prj_trans) { typedef coord_transform path_type; - typedef agg::renderer_base ren_base; + typedef agg::renderer_base ren_base; typedef agg::renderer_scanline_aa_solid renderer; - agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); - agg::pixfmt_rgba32 pixf(buf); + agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4); + agg::pixfmt_rgba32_pre pixf(buf); ren_base renb(pixf); color const& fill_ = sym.get_fill(); @@ -70,7 +71,12 @@ void agg_renderer::process(building_symbolizer const& sym, agg::scanline_u8 sl; ras_ptr->reset(); - ras_ptr->gamma(agg::gamma_power()); + if (gamma_method_ != GAMMA_POWER || gamma_ != 1.0) + { + ras_ptr->gamma(agg::gamma_power()); + gamma_method_ = GAMMA_POWER; + gamma_ = 1.0; + } double height = 0.0; expression_ptr height_expr = sym.height(); @@ -99,11 +105,15 @@ void agg_renderer::process(building_symbolizer const& sym, { frame->move_to(x,y); } - else if (cm == SEG_LINETO || cm == SEG_CLOSE) + 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; } @@ -140,11 +150,16 @@ void agg_renderer::process(building_symbolizer const& sym, frame->move_to(x,y+height); roof->move_to(x,y+height); } - else if (cm == SEG_LINETO || cm == SEG_CLOSE) + 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(); + } } path_type path(t_,*frame,prj_trans); diff --git a/src/agg/process_debug_symbolizer.cpp b/src/agg/process_debug_symbolizer.cpp index 535e4cf0f..277f7fea6 100644 --- a/src/agg/process_debug_symbolizer.cpp +++ b/src/agg/process_debug_symbolizer.cpp @@ -30,17 +30,17 @@ namespace mapnik { void draw_rect(image_32 &pixmap, box2d const& box) { - double x0 = box.minx(); - double x1 = box.maxx(); - double y0 = box.miny(); - double y1 = box.maxy(); + int x0 = static_cast(box.minx()); + int x1 = static_cast(box.maxx()); + int y0 = static_cast(box.miny()); + int y1 = static_cast(box.maxy()); unsigned color1 = 0xff0000ff; - for (double x=x0; x::process(debug_symbolizer const& sym, mapnik::feature_impl & feature, proj_transform const& prj_trans) { - label_collision_detector4::query_iterator itr = detector_->begin(), end = detector_->end(); - for (;itr!=end; itr++) + debug_symbolizer_mode_e mode = sym.get_mode(); + if (mode == DEBUG_SYM_MODE_COLLISION) { - draw_rect(pixmap_, itr->box); + label_collision_detector4::query_iterator itr = detector_->begin(), end = detector_->end(); + for (;itr!=end; itr++) + { + draw_rect(pixmap_, itr->box); + } + } + else if (mode == DEBUG_SYM_MODE_VERTEX) + { + for (unsigned i=0; i::process(line_pattern_symbolizer const& sym, { typedef agg::rgba8 color; typedef agg::order_rgba order; - typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba_pre blender_type; typedef agg::pattern_filter_bilinear_rgba8 pattern_filter_type; typedef agg::line_image_pattern pattern_type; @@ -115,7 +115,7 @@ void agg_renderer::process(line_pattern_symbolizer const& sym, if (!pat) return; - agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); + 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(sym.comp_op())); renderer_base ren_base(pixf); @@ -136,6 +136,7 @@ void agg_renderer::process(line_pattern_symbolizer const& sym, double half_stroke = (*mark)->width()/2.0; if (half_stroke > 1) padding *= half_stroke; + padding *= scale_factor_; clipping_extent.pad(padding); } diff --git a/src/agg/process_line_symbolizer.cpp b/src/agg/process_line_symbolizer.cpp index 8138ff098..bf7dcd2fb 100644 --- a/src/agg/process_line_symbolizer.cpp +++ b/src/agg/process_line_symbolizer.cpp @@ -34,6 +34,7 @@ #include "agg_basics.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" #include "agg_renderer_scanline.h" @@ -66,13 +67,17 @@ void agg_renderer::process(line_symbolizer const& sym, unsigned a=col.alpha(); ras_ptr->reset(); - set_gamma_method(stroke_, ras_ptr); + if (stroke_.get_gamma() != gamma_ || stroke_.get_gamma_method() != gamma_method_) + { + set_gamma_method(stroke_, ras_ptr); + gamma_method_ = stroke_.get_gamma_method(); + gamma_ = stroke_.get_gamma(); + } - agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); + agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4); typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; - typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba_pre blender_type; // comp blender typedef agg::pixfmt_custom_blend_rgba pixfmt_comp_type; typedef agg::renderer_base renderer_base; @@ -96,9 +101,11 @@ void agg_renderer::process(line_symbolizer const& sym, padding *= half_stroke; if (std::fabs(sym.offset()) > 0) padding *= std::fabs(sym.offset()) * 1.2; + padding *= scale_factor_; clipping_extent.pad(padding); // debugging - //box2d inverse(x0 + padding, y0 + padding, x1 - padding , y1 - padding); + //box2d inverse = query_extent_; + //inverse.pad(-padding); //draw_geo_extent(inverse,mapnik::color("red")); } diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp index ed1a0ea92..2e8b5469d 100644 --- a/src/agg/process_markers_symbolizer.cpp +++ b/src/agg/process_markers_symbolizer.cpp @@ -45,6 +45,7 @@ #include "agg_renderer_scanline.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" #include "agg_path_storage.h" @@ -64,7 +65,6 @@ void agg_renderer::process(markers_symbolizer const& sym, { typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; - typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba_pre blender_type; // comp blender typedef agg::rendering_buffer buf_type; typedef agg::pixfmt_custom_blend_rgba pixfmt_comp_type; @@ -74,13 +74,21 @@ void agg_renderer::process(markers_symbolizer const& sym, std::string filename = path_processor_type::evaluate(*sym.get_filename(), feature); + // https://github.com/mapnik/mapnik/issues/1316 + bool snap_pixels = !mapnik::marker_cache::instance().is_uri(filename); + if (!filename.empty()) { boost::optional mark = mapnik::marker_cache::instance().find(filename, true); if (mark && *mark) { ras_ptr->reset(); - ras_ptr->gamma(agg::gamma_power()); + if (gamma_method_ != GAMMA_POWER || gamma_ != 1.0) + { + ras_ptr->gamma(agg::gamma_power()); + gamma_method_ = GAMMA_POWER; + gamma_ = 1.0; + } agg::trans_affine geom_tr; evaluate_transform(geom_tr, feature, sym.get_transform()); agg::trans_affine tr = agg::trans_affine_scaling(scale_factor_); @@ -119,9 +127,16 @@ void agg_renderer::process(markers_symbolizer const& sym, coord2d center = bbox.center(); agg::trans_affine_translation recenter(-center.x, -center.y); agg::trans_affine marker_trans = recenter * tr; - buf_type render_buffer(current_buffer_->raw_data(), width_, height_, width_ * 4); - dispatch_type rasterizer_dispatch(render_buffer,svg_renderer,*ras_ptr, - bbox, marker_trans, sym, *detector_, scale_factor_); + buf_type render_buffer(current_buffer_->raw_data(), current_buffer_->width(), current_buffer_->height(), current_buffer_->width() * 4); + dispatch_type rasterizer_dispatch(render_buffer, + svg_renderer, + *ras_ptr, + bbox, + marker_trans, + sym, + *detector_, + scale_factor_, + snap_pixels); vertex_converter, dispatch_type, markers_symbolizer, CoordTransform, proj_transform, agg::trans_affine, conv_types> converter(query_extent_, rasterizer_dispatch, sym,t_,prj_trans,tr,scale_factor_); @@ -142,7 +157,7 @@ void agg_renderer::process(markers_symbolizer const& sym, else { box2d const& bbox = (*mark)->bounding_box(); - setup_transform_scaling(tr, bbox, feature, sym); + setup_transform_scaling(tr, bbox.width(), bbox.height(), feature, sym); evaluate_transform(tr, feature, sym.get_image_transform()); coord2d center = bbox.center(); agg::trans_affine_translation recenter(-center.x, -center.y); @@ -152,9 +167,16 @@ void agg_renderer::process(markers_symbolizer const& sym, svg_attribute_type attributes; bool result = push_explicit_style( (*stock_vector_marker)->attributes(), attributes, sym); svg_renderer_type svg_renderer(svg_path, result ? attributes : (*stock_vector_marker)->attributes()); - buf_type render_buffer(current_buffer_->raw_data(), width_, height_, width_ * 4); - dispatch_type rasterizer_dispatch(render_buffer,svg_renderer,*ras_ptr, - bbox, marker_trans, sym, *detector_, scale_factor_); + buf_type render_buffer(current_buffer_->raw_data(), current_buffer_->width(), current_buffer_->height(), current_buffer_->width() * 4); + dispatch_type rasterizer_dispatch(render_buffer, + svg_renderer, + *ras_ptr, + bbox, + marker_trans, + sym, + *detector_, + scale_factor_, + snap_pixels); vertex_converter, dispatch_type, markers_symbolizer, CoordTransform, proj_transform, agg::trans_affine, conv_types> converter(query_extent_, rasterizer_dispatch, sym,t_,prj_trans,tr,scale_factor_); @@ -175,17 +197,23 @@ void agg_renderer::process(markers_symbolizer const& sym, } else // raster markers { - box2d const& bbox = (*mark)->bounding_box(); - setup_transform_scaling(tr, bbox, feature, sym); + setup_transform_scaling(tr, (*mark)->width(), (*mark)->height(), feature, sym); evaluate_transform(tr, feature, sym.get_image_transform()); + box2d const& bbox = (*mark)->bounding_box(); coord2d center = bbox.center(); agg::trans_affine_translation recenter(-center.x, -center.y); agg::trans_affine marker_trans = recenter * tr; boost::optional marker = (*mark)->get_bitmap_data(); typedef raster_markers_rasterizer_dispatch dispatch_type; - buf_type render_buffer(current_buffer_->raw_data(), width_, height_, width_ * 4); - dispatch_type rasterizer_dispatch(render_buffer,*ras_ptr, **marker, - marker_trans, sym, *detector_, scale_factor_); + buf_type render_buffer(current_buffer_->raw_data(), current_buffer_->width(), current_buffer_->height(), current_buffer_->width() * 4); + dispatch_type rasterizer_dispatch(render_buffer, + *ras_ptr, + **marker, + marker_trans, + sym, + *detector_, + scale_factor_, + true /*snap rasters no matter what*/); vertex_converter, dispatch_type, markers_symbolizer, CoordTransform, proj_transform, agg::trans_affine, conv_types> converter(query_extent_, rasterizer_dispatch, sym,t_,prj_trans,tr,scale_factor_); diff --git a/src/agg/process_point_symbolizer.cpp b/src/agg/process_point_symbolizer.cpp index be25d5bf3..9db818a43 100644 --- a/src/agg/process_point_symbolizer.cpp +++ b/src/agg/process_point_symbolizer.cpp @@ -32,6 +32,8 @@ #include #include #include +#include + // agg #include "agg_trans_affine.h" @@ -70,7 +72,7 @@ void agg_renderer::process(point_symbolizer const& sym, evaluate_transform(tr, feature, sym.get_image_transform()); agg::trans_affine_translation recenter(-center.x, -center.y); agg::trans_affine recenter_tr = recenter * tr; - box2d label_ext = bbox * recenter_tr; + box2d label_ext = bbox * recenter_tr * agg::trans_affine_scaling(scale_factor_); for (unsigned i=0; i::process(polygon_pattern_symbolizer const& sym, typedef agg::conv_clip_polygon clipped_geometry_type; typedef coord_transform path_type; - agg::rendering_buffer buf(current_buffer_->raw_data(), width_, height_, width_ * 4); + agg::rendering_buffer buf(current_buffer_->raw_data(), current_buffer_->width(), current_buffer_->height(), current_buffer_->width() * 4); ras_ptr->reset(); - set_gamma_method(sym,ras_ptr); - + if (sym.get_gamma() != gamma_ || sym.get_gamma_method() != gamma_method_) + { + set_gamma_method(sym, ras_ptr); + gamma_method_ = sym.get_gamma_method(); + gamma_ = sym.get_gamma(); + } std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature); boost::optional marker; if ( !filename.empty() ) @@ -89,13 +94,12 @@ void agg_renderer::process(polygon_pattern_symbolizer const& sym, typedef agg::rgba8 color; typedef agg::order_rgba order; - typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba_pre blender_type; typedef agg::pixfmt_custom_blend_rgba pixfmt_type; typedef agg::wrap_mode_repeat wrap_x_type; typedef agg::wrap_mode_repeat wrap_y_type; - typedef agg::image_accessor_wrap img_source_type; @@ -113,7 +117,7 @@ void agg_renderer::process(polygon_pattern_symbolizer const& sym, unsigned w=(*pat)->width(); unsigned h=(*pat)->height(); agg::rendering_buffer pattern_rbuf((agg::int8u*)(*pat)->getBytes(),w,h,w*4); - agg::pixfmt_rgba32 pixf_pattern(pattern_rbuf); + agg::pixfmt_rgba32_pre pixf_pattern(pattern_rbuf); img_source_type img_src(pixf_pattern); pattern_alignment_e align = sym.get_alignment(); @@ -131,8 +135,8 @@ void agg_renderer::process(polygon_pattern_symbolizer const& sym, path_type path(t_,clipped,prj_trans); path.vertex(&x0,&y0); } - offset_x = unsigned(width_ - x0); - offset_y = unsigned(height_ - y0); + offset_x = unsigned(current_buffer_->width() - x0); + offset_y = unsigned(current_buffer_->height() - y0); } span_gen_type sg(img_src, offset_x, offset_y); diff --git a/src/agg/process_polygon_symbolizer.cpp b/src/agg/process_polygon_symbolizer.cpp index 107da8066..25e2f09a2 100644 --- a/src/agg/process_polygon_symbolizer.cpp +++ b/src/agg/process_polygon_symbolizer.cpp @@ -36,6 +36,8 @@ #include "agg_basics.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" +#include "agg_renderer_scanline.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" @@ -48,8 +50,12 @@ void agg_renderer::process(polygon_symbolizer const& sym, { ras_ptr->reset(); - set_gamma_method(sym,ras_ptr); - + if (sym.get_gamma() != gamma_ || sym.get_gamma_method() != gamma_method_) + { + set_gamma_method(sym, ras_ptr); + gamma_method_ = sym.get_gamma_method(); + gamma_ = sym.get_gamma(); + } agg::trans_affine tr; evaluate_transform(tr, feature, sym.get_transform()); @@ -72,7 +78,7 @@ void agg_renderer::process(polygon_symbolizer const& sym, } } - agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); + agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4); color const& fill = sym.get_fill(); unsigned r=fill.red(); @@ -82,7 +88,6 @@ void agg_renderer::process(polygon_symbolizer const& sym, typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; - typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba_pre blender_type; // comp blender typedef agg::pixfmt_custom_blend_rgba pixfmt_comp_type; typedef agg::renderer_base renderer_base; diff --git a/src/agg/process_raster_symbolizer.cpp b/src/agg/process_raster_symbolizer.cpp index 7da8bbdef..6dcdda2d9 100644 --- a/src/agg/process_raster_symbolizer.cpp +++ b/src/agg/process_raster_symbolizer.cpp @@ -63,10 +63,10 @@ void agg_renderer::process(raster_symbolizer const& sym, box2d target_ext = box2d(source->ext_); prj_trans.backward(target_ext, PROJ_ENVELOPE_POINTS); box2d ext = t_.forward(target_ext); - int start_x = static_cast(ext.minx()); - int start_y = static_cast(ext.miny()); - int end_x = static_cast(std::ceil(ext.maxx())); - int end_y = static_cast(std::ceil(ext.maxy())); + int start_x = static_cast(std::floor(ext.minx()+.5)); + int start_y = static_cast(std::floor(ext.miny()+.5)); + int end_x = static_cast(std::floor(ext.maxx()+.5)); + int end_y = static_cast(std::floor(ext.maxy()+.5)); int raster_width = end_x - start_x; int raster_height = end_y - start_y; if (raster_width > 0 && raster_height > 0) @@ -111,11 +111,13 @@ void agg_renderer::process(raster_symbolizer const& sym, } else { - double scaling_ratio = ext.width() / source->data_.width(); + double image_ratio_x = ext.width() / source->data_.width(); + double image_ratio_y = ext.height() / source->data_.height(); scale_image_agg(target.data_, source->data_, scaling_method, - scaling_ratio, + image_ratio_x, + image_ratio_y, 0.0, 0.0, filter_radius); diff --git a/src/agg/process_shield_symbolizer.cpp b/src/agg/process_shield_symbolizer.cpp index 752e74f96..753dccd14 100644 --- a/src/agg/process_shield_symbolizer.cpp +++ b/src/agg/process_shield_symbolizer.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include // boost #include @@ -47,7 +49,7 @@ void agg_renderer::process(shield_symbolizer const& sym, text_renderer ren(*current_buffer_, font_manager_, - *(font_manager_.get_stroker()), + sym.get_halo_rasterizer(), sym.comp_op(), scale_factor_); diff --git a/src/agg/process_text_symbolizer.cpp b/src/agg/process_text_symbolizer.cpp index 9b438abf7..0ee0e9559 100644 --- a/src/agg/process_text_symbolizer.cpp +++ b/src/agg/process_text_symbolizer.cpp @@ -26,6 +26,7 @@ #include #include #include +#include namespace mapnik { @@ -44,7 +45,7 @@ void agg_renderer::process(text_symbolizer const& sym, text_renderer ren(*current_buffer_, font_manager_, - *(font_manager_.get_stroker()), + sym.get_halo_rasterizer(), sym.comp_op(), scale_factor_); diff --git a/src/box2d.cpp b/src/box2d.cpp index de767ac35..b7fbdb3b2 100644 --- a/src/box2d.cpp +++ b/src/box2d.cpp @@ -128,6 +128,30 @@ T box2d::maxy() const return maxy_; } +template +void box2d::set_minx(T v) +{ + minx_ = v; +} + +template +void box2d::set_miny(T v) +{ + miny_ = v; +} + +template +void box2d::set_maxx(T v) +{ + maxx_ = v; +} + +template +void box2d::set_maxy(T v) +{ + maxy_ = v; +} + template #if !defined(__SUNPRO_CC) inline diff --git a/src/build.py b/src/build.py index 487abfc10..057fae22c 100644 --- a/src/build.py +++ b/src/build.py @@ -48,6 +48,7 @@ mapnik_lib_link_flag = '' # note: .data gets the actual list to allow a true copy # and avoids unintended pollution of other environments libmapnik_cxxflags = copy(lib_env['CXXFLAGS'].data) +libmapnik_defines = copy(lib_env['CPPDEFINES']) ABI_VERSION = env['ABI_VERSION'] @@ -56,26 +57,44 @@ regex = 'boost_regex%s' % env['BOOST_APPEND'] system = 'boost_system%s' % env['BOOST_APPEND'] # clear out and re-set libs for this env -lib_env['LIBS'] = ['freetype','ltdl','png','tiff','z','proj',env['ICU_LIB_NAME'],filesystem,system,regex] +lib_env['LIBS'] = ['freetype',env['ICU_LIB_NAME'],filesystem,system,regex] -if env['JPEG']: +if '-DMAPNIK_USE_PROJ4' in env['CPPDEFINES']: + lib_env['LIBS'].append('proj') + +enabled_imaging_libraries = [] + +if '-DHAVE_PNG' in env['CPPDEFINES']: + lib_env['LIBS'].append('png') + enabled_imaging_libraries.append('png_reader.cpp') + +if '-DHAVE_TIFF' in env['CPPDEFINES']: + lib_env['LIBS'].append('tiff') + enabled_imaging_libraries.append('tiff_reader.cpp') + +if '-DHAVE_WEBP' in env['CPPDEFINES']: + lib_env['LIBS'].append('webp') + enabled_imaging_libraries.append('webp_reader.cpp') + +if '-DHAVE_JPEG' in env['CPPDEFINES']: lib_env['LIBS'].append('jpeg') + enabled_imaging_libraries.append('jpeg_reader.cpp') if len(env['EXTRA_FREETYPE_LIBS']): lib_env['LIBS'].extend(copy(env['EXTRA_FREETYPE_LIBS'])) -# libxml2 should be optional but is currently not -# https://github.com/mapnik/mapnik/issues/913 lib_env['LIBS'].append('xml2') +lib_env['LIBS'].append('z') if env['THREADING'] == 'multi': lib_env['LIBS'].append('boost_thread%s' % env['BOOST_APPEND']) +if '-DBOOST_REGEX_HAS_ICU' in env['CPPDEFINES']: + lib_env['LIBS'].append('icui18n') if env['RUNTIME_LINK'] == 'static': if 'icuuc' in env['ICU_LIB_NAME']: lib_env['LIBS'].append('icudata') - lib_env['LIBS'].append('icui18n') else: lib_env['LIBS'].insert(0, 'agg') @@ -100,6 +119,9 @@ else: # unix, non-macos source = Split( """ + fs.cpp + debug_symbolizer.cpp + request.cpp well_known_srs.cpp params.cpp image_filter_types.cpp @@ -113,6 +135,7 @@ source = Split( box2d.cpp building_symbolizer.cpp datasource_cache.cpp + datasource_cache_static.cpp debug.cpp deepcopy.cpp expression_node.cpp @@ -122,6 +145,7 @@ source = Split( transform_expression_grammar.cpp transform_expression.cpp feature_kv_iterator.cpp + feature_style_processor.cpp feature_type_style.cpp font_engine_freetype.cpp font_set.cpp @@ -142,7 +166,6 @@ source = Split( path_expression_grammar.cpp placement_finder.cpp plugin.cpp - png_reader.cpp point_symbolizer.cpp polygon_pattern_symbolizer.cpp polygon_symbolizer.cpp @@ -150,7 +173,6 @@ source = Split( save_map.cpp shield_symbolizer.cpp text_symbolizer.cpp - tiff_reader.cpp wkb.cpp projection.cpp proj_transform.cpp @@ -198,20 +220,49 @@ source = Split( """ ) +if env['PLUGIN_LINKING'] == 'static': + hit = False + for plugin in env['REQUESTED_PLUGINS']: + details = env['PLUGINS'][plugin] + if details['lib'] in env['LIBS'] or not details['lib']: + plugin_env = SConscript('../plugins/input/%s/build.py' % plugin) + if not plugin_env: + print("Notice: no 'plugin_env' variable found for plugin: '%s'" % plugin) + else: + hit = True + DEF = '-DMAPNIK_STATIC_PLUGIN_%s' % plugin.upper() + lib_env.Append(CPPDEFINES = DEF) + if DEF not in libmapnik_defines: + libmapnik_defines.append(DEF) + if plugin_env.has_key('SOURCES') and plugin_env['SOURCES']: + source += ['../plugins/input/%s/%s' % (plugin, src) for src in plugin_env['SOURCES']] + if plugin_env.has_key('CPPDEFINES') and plugin_env['CPPDEFINES']: + lib_env.AppendUnique(CPPDEFINES=plugin_env['CPPDEFINES']) + if plugin_env.has_key('CXXFLAGS') and plugin_env['CXXFLAGS']: + lib_env.AppendUnique(CXXFLAGS=plugin_env['CXXFLAGS']) + if plugin_env.has_key('LINKFLAGS') and plugin_env['LINKFLAGS']: + lib_env.AppendUnique(LINKFLAGS=plugin_env['LINKFLAGS']) + if plugin_env.has_key('CPPPATH') and plugin_env['CPPPATH']: + lib_env.AppendUnique(CPPPATH=copy(plugin_env['CPPPATH'])) + if plugin_env.has_key('LIBS') and plugin_env['LIBS']: + lib_env.AppendUnique(LIBS=plugin_env['LIBS']) + else: + print("Notice: dependencies not met for plugin '%s', not building..." % plugin) + if hit: + lib_env.Append(CPPDEFINES = '-DMAPNIK_STATIC_PLUGINS') + libmapnik_defines.append('-DMAPNIK_STATIC_PLUGINS') + if env['HAS_CAIRO']: lib_env.AppendUnique(LIBPATH=env['CAIRO_LIBPATHS']) - lib_env.Append(LIBS=env['CAIRO_LINKFLAGS']) - lib_env.Append(CXXFLAGS = '-DHAVE_CAIRO') - libmapnik_cxxflags.append('-DHAVE_CAIRO') + lib_env.Append(LIBS=env['CAIRO_ALL_LIBS']) + lib_env.Append(CPPDEFINES = '-DHAVE_CAIRO') + libmapnik_defines.append('-DHAVE_CAIRO') lib_env.AppendUnique(CPPPATH=copy(env['CAIRO_CPPPATHS'])) source.insert(0,'cairo_renderer.cpp') source.insert(0,'cairo_context.cpp') -if env['JPEG']: - source += Split( - """ - jpeg_reader.cpp - """) +for cpp in enabled_imaging_libraries: + source.append(cpp) # agg backend source += Split( @@ -241,21 +292,24 @@ if env['RUNTIME_LINK'] == "static": source += glob.glob('../deps/agg/src/' + '*.cpp') # grid backend -source += Split( - """ - grid/grid.cpp - grid/grid_renderer.cpp - 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 - """) +if env['GRID_RENDERER']: + source += Split( + """ + grid/grid.cpp + grid/grid_renderer.cpp + 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 + """) + lib_env.Append(CPPDEFINES = '-DGRID_RENDERER') + libmapnik_defines.append('-DGRID_RENDERER') # https://github.com/mapnik/mapnik/issues/1438 if env['SVG_RENDERER']: # svg backend @@ -276,8 +330,8 @@ if env['SVG_RENDERER']: # svg backend svg/output/process_shield_symbolizer.cpp svg/output/process_text_symbolizer.cpp """) - lib_env.Append(CXXFLAGS = '-DSVG_RENDERER') - libmapnik_cxxflags.append('-DSVG_RENDERER') + lib_env.Append(CPPDEFINES = '-DSVG_RENDERER') + libmapnik_defines.append('-DSVG_RENDERER') if env.get('BOOST_LIB_VERSION_FROM_HEADER'): @@ -300,8 +354,8 @@ if env['XMLPARSER'] == 'libxml2' and env['HAS_LIBXML2']: libxml2_loader.cpp """) env2 = lib_env.Clone() - env2.Append(CXXFLAGS = '-DHAVE_LIBXML2') - libmapnik_cxxflags.append('-DHAVE_LIBXML2') + env2.Append(CPPDEFINES = '-DHAVE_LIBXML2') + libmapnik_defines.append('-DHAVE_LIBXML2') fixup = ['libxml2_loader.cpp'] for cpp in fixup: if cpp in source: @@ -317,26 +371,19 @@ else: """ ) -processor_cpp = 'feature_style_processor.cpp' - -if env['RENDERING_STATS']: - env3 = lib_env.Clone() - env3.Append(CXXFLAGS='-DRENDERING_STATS') - if env['LINKING'] == 'static': - source.insert(0,env3.StaticObject(processor_cpp)) - else: - source.insert(0,env3.SharedObject(processor_cpp)) -else: - source.insert(0,processor_cpp); +# clone the env one more time to isolate mapnik_lib_link_flag +lib_env_final = lib_env.Clone() if env['CUSTOM_LDFLAGS']: - linkflags = '%s %s' % (env['CUSTOM_LDFLAGS'], mapnik_lib_link_flag) + lib_env_final.Prepend(LINKFLAGS='%s %s' % (env['CUSTOM_LDFLAGS'], mapnik_lib_link_flag)) else: - linkflags = mapnik_lib_link_flag + lib_env_final.Prepend(LINKFLAGS=mapnik_lib_link_flag) # cache library values for other builds to use env['LIBMAPNIK_LIBS'] = copy(lib_env['LIBS']) +env['LIBMAPNIK_LINKFLAGS'] = copy(lib_env['LINKFLAGS']) env['LIBMAPNIK_CXXFLAGS'] = libmapnik_cxxflags +env['LIBMAPNIK_DEFINES'] = libmapnik_defines mapnik = None @@ -344,9 +391,9 @@ if env['PLATFORM'] == 'Darwin': target_path = env['MAPNIK_LIB_BASE_DEST'] if 'uninstall' not in COMMAND_LINE_TARGETS: if env['LINKING'] == 'static': - mapnik = lib_env.StaticLibrary('mapnik', source, LINKFLAGS=linkflags) + mapnik = lib_env_final.StaticLibrary('mapnik', source) else: - mapnik = lib_env.SharedLibrary('mapnik', source, LINKFLAGS=linkflags) + mapnik = lib_env_final.SharedLibrary('mapnik', source) result = env.Install(target_path, mapnik) env.Alias(target='install', source=result) @@ -368,15 +415,14 @@ else: if 'uninstall' not in COMMAND_LINE_TARGETS: if env['LINKING'] == 'static': - mapnik = lib_env.StaticLibrary('mapnik', source, LINKFLAGS=linkflags) + mapnik = lib_env_final.StaticLibrary('mapnik', source) else: - mapnik = lib_env.SharedLibrary('mapnik', source, LINKFLAGS=linkflags) + mapnik = lib_env_final.SharedLibrary('mapnik', source) result = env.InstallAs(target=target, source=mapnik) env.Alias(target='install', source=result) if result: env.AddPostAction(result, ldconfig) - # Install symlinks target1 = os.path.join(env['MAPNIK_LIB_BASE_DEST'], "%s.%d.%d" % \ (os.path.basename(env.subst(env['MAPNIK_LIB_NAME'])),int(major), int(minor))) diff --git a/src/cairo_context.cpp b/src/cairo_context.cpp index d2a3a9271..cf04116f3 100644 --- a/src/cairo_context.cpp +++ b/src/cairo_context.cpp @@ -21,9 +21,34 @@ *****************************************************************************/ #include +#include +#include +#include +#include +#include + +#include namespace mapnik { +cairo_face::cairo_face(boost::shared_ptr const& engine, face_ptr const& face) + : face_(face) +{ + static cairo_user_data_key_t key; + c_face_ = cairo_ft_font_face_create_for_ft_face(face->get_face(), FT_LOAD_NO_HINTING); + cairo_font_face_set_user_data(c_face_, &key, new handle(engine, face), destroy); +} + +cairo_face::~cairo_face() +{ + if (c_face_) cairo_font_face_destroy(c_face_); +} + +cairo_font_face_t * cairo_face::face() const +{ + return c_face_; +} + cairo_context::cairo_context(cairo_ptr const& cairo) : cairo_(cairo) {} @@ -130,7 +155,6 @@ void cairo_context::set_operator(composite_mode_e comp_op) cairo_set_operator(cairo_.get(), CAIRO_OPERATOR_EXCLUSION); break; #else -#warning building against cairo older that 1.10.0, some compositing options are disabled case multiply: case screen: case overlay: @@ -210,7 +234,7 @@ void cairo_context::set_dash(dash_array const &dashes, double scale_factor) d[index++] = itr->second * scale_factor; } - cairo_set_dash(cairo_.get() , &d[0], dashes.size(), 0/*offset*/); + cairo_set_dash(cairo_.get() , &d[0], d.size(), 0/*offset*/); check_object_status_and_throw_exception(*this); } @@ -417,7 +441,7 @@ void cairo_context::add_text(text_path const& path, char_info_ptr c; double x, y, angle; - path.vertex(&c, &x, &y, &angle); + path.vertex(c, x, y, angle); face_set_ptr faces = font_manager.get_face_set(c->format->face_name, c->format->fontset); double text_size = c->format->text_size * scale_factor; @@ -434,19 +458,46 @@ void cairo_context::add_text(text_path const& path, matrix.yy = text_size * std::cos(angle); matrix.x0 = 0; matrix.y0 = 0; - set_font_matrix(matrix); - set_font_face(manager, glyph->get_face()); - glyph_path(glyph->get_index(), sx + x, sy - y); set_line_width(2.0 * c->format->halo_radius * scale_factor); set_line_join(ROUND_JOIN); set_color(c->format->halo_fill); stroke(); + } + } + + path.rewind(); + + for (int iii = 0; iii < path.num_nodes(); iii++) + { + char_info_ptr c; + double x, y, angle; + + path.vertex(c, x, y, angle); + + face_set_ptr faces = font_manager.get_face_set(c->format->face_name, c->format->fontset); + double text_size = c->format->text_size * scale_factor; + faces->set_character_sizes(text_size); + + glyph_ptr glyph = faces->get_glyph(c->c); + + if (glyph) + { + cairo_matrix_t matrix; + matrix.xx = text_size * std::cos(angle); + matrix.xy = text_size * std::sin(angle); + matrix.yx = text_size * -std::sin(angle); + matrix.yy = text_size * std::cos(angle); + matrix.x0 = 0; + matrix.y0 = 0; + set_font_matrix(matrix); + set_font_face(manager, glyph->get_face()); set_color(c->format->fill); show_glyph(glyph->get_index(), sx + x, sy - y); } } + } } diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index 7d610623f..3a13b6067 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -53,6 +53,7 @@ #include #include #include +#include // cairo #include @@ -140,6 +141,28 @@ cairo_renderer_base::cairo_renderer_base(Map const& m, setup(m); } +cairo_renderer_base::cairo_renderer_base(Map const& m, + request const& req, + cairo_ptr const& cairo, + double scale_factor, + unsigned offset_x, + unsigned offset_y) + : m_(m), + context_(cairo), + width_(req.width()), + height_(req.height()), + scale_factor_(scale_factor), + t_(req.width(),req.height(),req.extent(),offset_x,offset_y), + font_engine_(boost::make_shared()), + font_manager_(*font_engine_), + face_manager_(font_engine_), + detector_(boost::make_shared( + box2d(-req.buffer_size(), -req.buffer_size(), + req.width() + req.buffer_size(), req.height() + req.buffer_size()))) +{ + setup(m); +} + cairo_renderer_base::cairo_renderer_base(Map const& m, cairo_ptr const& cairo, boost::shared_ptr detector, @@ -170,6 +193,16 @@ cairo_renderer::cairo_renderer(Map const& m, cairo_surface_pt : feature_style_processor(m,scale_factor), cairo_renderer_base(m,create_context(surface),scale_factor,offset_x,offset_y) {} +template <> +cairo_renderer::cairo_renderer(Map const& m, request const& req, cairo_ptr const& cairo, double scale_factor, unsigned offset_x, unsigned offset_y) + : feature_style_processor(m,scale_factor), + cairo_renderer_base(m,req,cairo,scale_factor,offset_x,offset_y) {} + +template <> +cairo_renderer::cairo_renderer(Map const& m, request const& req, cairo_surface_ptr const& surface, double scale_factor, unsigned offset_x, unsigned offset_y) + : feature_style_processor(m,scale_factor), + cairo_renderer_base(m,req, create_context(surface),scale_factor,offset_x,offset_y) {} + template <> cairo_renderer::cairo_renderer(Map const& m, cairo_ptr const& cairo, boost::shared_ptr detector, double scale_factor, unsigned offset_x, unsigned offset_y) : feature_style_processor(m,scale_factor), @@ -225,14 +258,9 @@ void cairo_renderer_base::setup(Map const& map) void cairo_renderer_base::start_map_processing(Map const& map) { MAPNIK_LOG_DEBUG(cairo_renderer) << "cairo_renderer_base: Start map processing bbox=" << map.get_current_extent(); - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 6, 0) box2d bounds = t_.forward(t_.extent()); context_.rectangle(bounds.minx(), bounds.miny(), bounds.maxx(), bounds.maxy()); context_.clip(); -#else -#warning building against cairo older that 1.6.0, map clipping is disabled -#endif } template <> @@ -346,11 +374,15 @@ void cairo_renderer_base::process(building_symbolizer const& sym, { frame->move_to(x,y); } - else if (cm == SEG_LINETO || cm == SEG_CLOSE) + 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; } @@ -385,11 +417,16 @@ void cairo_renderer_base::process(building_symbolizer const& sym, frame->move_to(x,y+height); roof->move_to(x,y+height); } - else if (cm == SEG_LINETO || cm == SEG_CLOSE) + 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(); + } } path_type path(t_, *frame, prj_trans); @@ -439,6 +476,7 @@ void cairo_renderer_base::process(line_symbolizer const& sym, padding *= half_stroke; if (std::fabs(sym.offset()) > 0) padding *= std::fabs(sym.offset()) * 1.2; + padding *= scale_factor_; clipping_extent.pad(padding); } vertex_converter, cairo_context, line_symbolizer, @@ -530,14 +568,14 @@ void render_vector_marker(cairo_context & context, pixel_position const& pos, ma } if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT) { - cairo_gradient g(attr.fill_gradient,attr.fill_opacity*opacity); + cairo_gradient g(attr.fill_gradient,attr.fill_opacity * attr.opacity * opacity); context.set_gradient(g,bbox); context.fill(); } else if(attr.fill_flag) { - double fill_opacity = attr.fill_opacity * opacity * attr.fill_color.opacity(); + double fill_opacity = attr.fill_opacity * attr.opacity * opacity * attr.fill_color.opacity(); context.set_color(attr.fill_color.r/255.0,attr.fill_color.g/255.0, attr.fill_color.b/255.0, fill_opacity); context.fill(); @@ -553,13 +591,13 @@ void render_vector_marker(cairo_context & context, pixel_position const& pos, ma context.set_line_cap(line_cap_enum(attr.line_cap)); context.set_line_join(line_join_enum(attr.line_join)); context.set_miter_limit(attr.miter_limit); - cairo_gradient g(attr.stroke_gradient,attr.fill_opacity*opacity); + cairo_gradient g(attr.stroke_gradient,attr.fill_opacity * attr.opacity * opacity); context.set_gradient(g,bbox); context.stroke(); } else if (attr.stroke_flag) { - double stroke_opacity = attr.stroke_opacity * opacity * attr.stroke_color.opacity(); + double stroke_opacity = attr.stroke_opacity * attr.opacity * opacity * attr.stroke_color.opacity(); context.set_color(attr.stroke_color.r/255.0,attr.stroke_color.g/255.0, attr.stroke_color.b/255.0, stroke_opacity); context.set_line_width(attr.stroke_width); @@ -573,7 +611,11 @@ void render_vector_marker(cairo_context & context, pixel_position const& pos, ma } -void cairo_renderer_base::render_marker(pixel_position const& pos, marker const& marker, const agg::trans_affine & tr, double opacity, bool recenter) +void cairo_renderer_base::render_marker(pixel_position const& pos, + marker const& marker, + agg::trans_affine const& tr, + double opacity, + bool recenter) { cairo_save_restore guard(context_); @@ -582,21 +624,24 @@ void cairo_renderer_base::render_marker(pixel_position const& pos, marker const& mapnik::svg_path_ptr vmarker = *marker.get_vector_data(); if (vmarker) { + agg::trans_affine marker_tr = tr; + marker_tr *=agg::trans_affine_scaling(scale_factor_); agg::pod_bvector const & attributes = vmarker->attributes(); - render_vector_marker(context_, pos, *vmarker, attributes, tr, opacity, recenter); + render_vector_marker(context_, pos, *vmarker, attributes, marker_tr, opacity, recenter); } } else if (marker.is_bitmap()) { - agg::trans_affine matrix = tr; double width = (*marker.get_bitmap_data())->width(); double height = (*marker.get_bitmap_data())->height(); double cx = 0.5 * width; double cy = 0.5 * height; - matrix *= agg::trans_affine_translation( - boost::math::iround(pos.x - cx), - boost::math::iround(pos.y - cy)); - context_.add_image(matrix, **marker.get_bitmap_data(), opacity); + agg::trans_affine marker_tr; + marker_tr *= agg::trans_affine_translation(-cx,-cy); + marker_tr *= tr; + marker_tr *= agg::trans_affine_scaling(scale_factor_); + marker_tr *= agg::trans_affine_translation(pos.x,pos.y); + context_.add_image(marker_tr, **marker.get_bitmap_data(), opacity); } } @@ -619,6 +664,15 @@ void cairo_renderer_base::process(point_symbolizer const& sym, if (marker) { + box2d const& bbox = (*marker)->bounding_box(); + coord2d center = bbox.center(); + + agg::trans_affine tr; + evaluate_transform(tr, feature, sym.get_image_transform()); + agg::trans_affine_translation recenter(-center.x, -center.y); + agg::trans_affine recenter_tr = recenter * tr; + box2d label_ext = bbox * recenter_tr * agg::trans_affine_scaling(scale_factor_); + for (unsigned i = 0; i < feature.num_geometries(); ++i) { geometry_type const& geom = feature.get_geometry(i); @@ -639,14 +693,7 @@ void cairo_renderer_base::process(point_symbolizer const& sym, prj_trans.backward(x, y, z); t_.forward(&x, &y); - - double dx = 0.5 * (*marker)->width(); - double dy = 0.5 * (*marker)->height(); - agg::trans_affine tr = agg::trans_affine_scaling(scale_factor_); - evaluate_transform(tr, feature, sym.get_image_transform()); - box2d label_ext (-dx, -dy, dx, dy); - label_ext *= tr; - label_ext *= agg::trans_affine_translation(x,y); + label_ext.re_center(x,y); if (sym.get_allow_overlap() || detector_->has_placement(label_ext)) { @@ -681,15 +728,9 @@ void cairo_renderer_base::process(shield_symbolizer const& sym, pixel_position pos = helper.get_marker_position(placements[ii]); pos.x += 0.5 * helper.get_marker_width(); pos.y += 0.5 * helper.get_marker_height(); - double dx = 0.5 * helper.get_marker_width(); - double dy = 0.5 * helper.get_marker_height(); - agg::trans_affine marker_tr = agg::trans_affine_translation(-dx,-dy); - marker_tr *= agg::trans_affine_scaling(scale_factor_); - marker_tr *= agg::trans_affine_translation(dx,dy); - marker_tr *= helper.get_image_transform(); render_marker(pos, helper.get_marker(), - marker_tr, + helper.get_image_transform(), sym.get_opacity()); context_.add_text(placements[ii], face_manager_, font_manager_, scale_factor_); @@ -775,8 +816,8 @@ void cairo_renderer_base::process(polygon_pattern_symbolizer const& sym, mapnik::feature_impl & feature, proj_transform const& prj_trans) { - typedef agg::conv_clip_polygon clipped_geometry_type; - typedef coord_transform path_type; + //typedef agg::conv_clip_polygon clipped_geometry_type; + //typedef coord_transform path_type; cairo_save_restore guard(context_); context_.set_operator(sym.comp_op()); @@ -850,10 +891,10 @@ void cairo_renderer_base::process(raster_symbolizer const& sym, box2d target_ext = box2d(source->ext_); prj_trans.backward(target_ext, PROJ_ENVELOPE_POINTS); box2d ext = t_.forward(target_ext); - int start_x = static_cast(ext.minx()); - int start_y = static_cast(ext.miny()); - int end_x = static_cast(std::ceil(ext.maxx())); - int end_y = static_cast(std::ceil(ext.maxy())); + int start_x = static_cast(std::floor(ext.minx()+.5)); + int start_y = static_cast(std::floor(ext.miny()+.5)); + int end_x = static_cast(std::floor(ext.maxx()+.5)); + int end_y = static_cast(std::floor(ext.maxy()+.5)); int raster_width = end_x - start_x; int raster_height = end_y - start_y; if (raster_width > 0 && raster_height > 0) @@ -870,7 +911,10 @@ void cairo_renderer_base::process(raster_symbolizer const& sym, } if (premultiply_source) { - agg::rendering_buffer buffer(source->data_.getBytes(),source->data_.width(),source->data_.height(),source->data_.width() * 4); + agg::rendering_buffer buffer(source->data_.getBytes(), + source->data_.width(), + source->data_.height(), + source->data_.width() * 4); agg::pixfmt_rgba32 pixf(buffer); pixf.premultiply(); } @@ -888,14 +932,20 @@ void cairo_renderer_base::process(raster_symbolizer const& sym, { if (scaling_method == SCALING_BILINEAR8) { - scale_image_bilinear8(target.data_,source->data_, 0.0, 0.0); - } else + scale_image_bilinear8(target.data_, + source->data_, + 0.0, + 0.0); + } + else { - double scaling_ratio = ext.width() / source->data_.width(); + double image_ratio_x = ext.width() / source->data_.width(); + double image_ratio_y = ext.height() / source->data_.height(); scale_image_agg(target.data_, source->data_, scaling_method, - scaling_ratio, + image_ratio_x, + image_ratio_y, 0.0, 0.0, filter_radius); @@ -981,7 +1031,7 @@ struct markers_dispatch sym_.get_max_error(), sym_.get_allow_overlap()); double x, y, angle; - while (placement.get_point(x, y, angle)) + while (placement.get_point(x, y, angle, sym_.get_ignore_placement())) { agg::trans_affine matrix = marker_trans_; matrix.rotate(angle); @@ -1069,7 +1119,7 @@ struct markers_dispatch_2 sym_.get_max_error(), sym_.get_allow_overlap()); double x, y, angle; - while (placement.get_point(x, y, angle)) + while (placement.get_point(x, y, angle, sym_.get_ignore_placement())) { coord2d center = bbox_.center(); agg::trans_affine matrix = agg::trans_affine_translation(-center.x, -center.y); @@ -1112,7 +1162,7 @@ void cairo_renderer_base::process(markers_symbolizer const& sym, agg::trans_affine geom_tr; evaluate_transform(geom_tr, feature, sym.get_transform()); box2d const& bbox = (*mark)->bounding_box(); - setup_transform_scaling(tr, bbox, feature, sym); + setup_transform_scaling(tr, bbox.width(), bbox.height(), feature, sym); evaluate_transform(tr, feature, sym.get_image_transform()); if ((*mark)->is_vector()) diff --git a/src/color.cpp b/src/color.cpp index ebc76948f..65f178825 100644 --- a/src/color.cpp +++ b/src/color.cpp @@ -29,8 +29,8 @@ #include "agg_color_rgba.h" // boost -#include - +#include +#include // stl #include @@ -43,42 +43,47 @@ color::color(std::string const& str) std::string color::to_string() const { - std::stringstream ss; - if (alpha_ == 255) - { - ss << "rgb(" - << static_cast(red()) << "," - << static_cast(green()) << "," - << static_cast(blue()) << ")"; - } - else - { - ss << "rgba(" - << static_cast(red()) << "," - << static_cast(green()) << "," - << static_cast(blue()) << "," - << alpha() / 255.0 << ")"; - } - return ss.str(); + namespace karma = boost::spirit::karma; + using boost::spirit::karma::_1; + using boost::spirit::karma::eps; + using boost::spirit::karma::double_; + using boost::spirit::karma::string; + boost::spirit::karma::uint_generator color_generator; + std::string str; + std::back_insert_iterator sink(str); + karma::generate(sink, + // begin grammar + string[ phoenix::if_(alpha()==255) [_1="rgb("].else_[_1="rgba("]] + << color_generator[_1 = red()] << ',' + << color_generator[_1 = green()] << ',' + << color_generator[_1 = blue()] + << string[ phoenix::if_(alpha()==255) [_1 = ')'].else_[_1 =',']] + << eps(alpha()<255) << double_ [_1 = alpha()/255.0] + << ')' + // end grammar + ); + return str; } std::string color::to_hex_string() const { - if (alpha_ == 255 ) - { - return (boost::format("#%1$02x%2$02x%3$02x") - % static_cast(red()) - % static_cast(green()) - % static_cast(blue())).str(); - } - else - { - return (boost::format("#%1$02x%2$02x%3$02x%4$02x") - % static_cast(red()) - % static_cast(green()) - % static_cast(blue()) - % static_cast(alpha())).str(); - } + namespace karma = boost::spirit::karma; + using boost::spirit::karma::_1; + using boost::spirit::karma::hex; + using boost::spirit::karma::eps; + using boost::spirit::karma::right_align; + std::string str; + std::back_insert_iterator sink(str); + karma::generate(sink, + // begin grammar + '#' + << right_align(2,'0')[hex[_1 = red()]] + << right_align(2,'0')[hex[_1 = green()]] + << right_align(2,'0')[hex[_1 = blue()]] + << eps(alpha() < 255) << right_align(2,'0')[hex [_1 = alpha()]] + // end grammar + ); + return str; } void color::premultiply() diff --git a/src/color_factory.cpp b/src/color_factory.cpp index d9a1e6971..5ede3e60e 100644 --- a/src/color_factory.cpp +++ b/src/color_factory.cpp @@ -27,7 +27,6 @@ #include // boost -#include #include // stl diff --git a/src/config_error.cpp b/src/config_error.cpp index c8889b149..8de797072 100644 --- a/src/config_error.cpp +++ b/src/config_error.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include namespace mapnik diff --git a/src/conversions.cpp b/src/conversions.cpp index fe916092d..c4abfff54 100644 --- a/src/conversions.cpp +++ b/src/conversions.cpp @@ -28,6 +28,10 @@ #include +#if _MSC_VER +#define snprintf _snprintf +#endif + #define BOOST_SPIRIT_AUTO(domain_, name, expr) \ typedef boost::proto::result_of:: \ deep_copy::type name##_expr_type; \ @@ -45,8 +49,6 @@ #undef MAPNIK_KARMA_TO_STRING #else #include - #include // log10 - #include // trunc to avoid needing C++11 #endif #endif @@ -78,11 +80,9 @@ struct bool_symbols : qi::symbols } }; -bool string2bool(const char * value, bool & result) +bool string2bool(const char * iter, const char * end, bool & result) { using boost::spirit::qi::no_case; - const char *iter = value; - const char *end = value + std::strlen(value); bool r = qi::phrase_parse(iter,end, no_case[bool_symbols()] ,ascii::space,result); return r && (iter == end); } @@ -96,10 +96,8 @@ bool string2bool(std::string const& value, bool & result) return r && (str_beg == str_end); } -bool string2int(const char * value, int & result) +bool string2int(const char * iter, const char * end, int & result) { - const char *iter = value; - const char *end = value + std::strlen(value); bool r = qi::phrase_parse(iter,end,INTEGER,ascii::space,result); return r && (iter == end); } @@ -113,10 +111,8 @@ bool string2int(std::string const& value, int & result) } #ifdef BIGINT -bool string2int(const char * value, mapnik::value_integer & result) +bool string2int(const char * iter, const char * end, mapnik::value_integer & result) { - const char *iter = value; - const char *end = value + std::strlen(value); bool r = qi::phrase_parse(iter,end,LONGLONG,ascii::space,result); return r && (iter == end); } @@ -138,10 +134,8 @@ bool string2double(std::string const& value, double & result) return r && (str_beg == str_end); } -bool string2double(const char * value, double & result) +bool string2double(const char * iter, const char * end, double & result) { - const char *iter = value; - const char *end = value + std::strlen(value); bool r = qi::phrase_parse(iter,end,DOUBLE,ascii::space,result); return r && (iter == end); } @@ -154,14 +148,30 @@ bool string2float(std::string const& value, float & result) return r && (str_beg == str_end); } -bool string2float(const char * value, float & result) +bool string2float(const char * iter, const char * end, float & result) { - const char *iter = value; - const char *end = value + std::strlen(value); bool r = qi::phrase_parse(iter,end,FLOAT,ascii::space,result); return r && (iter == end); } +// double conversion - here we use sprintf over karma to work +// around https://github.com/mapnik/mapnik/issues/1741 +bool to_string(std::string & s, double val) +{ + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast(snprintf(&s[0], s.size()+1, "%g", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return true; +} + #ifdef MAPNIK_KARMA_TO_STRING bool to_string(std::string & str, int value) @@ -194,95 +204,6 @@ bool to_string(std::string & str, bool value) return karma::generate(sink, value); } -namespace detail { - template - struct double_policy : boost::spirit::karma::real_policies - { - typedef boost::spirit::karma::real_policies base_type; - - static int floatfield(T n) { - using namespace boost::spirit; // for traits - - if (traits::test_zero(n)) - return base_type::fmtflags::fixed; - - T abs_n = traits::get_absolute_value(n); - return (abs_n >= 1e16 || abs_n < 1e-4) - ? base_type::fmtflags::scientific : base_type::fmtflags::fixed; - } - - static unsigned precision(T n) { - if ( n == 0.0 ) return 0; - using namespace boost::spirit; // for traits - return static_cast(15 - boost::math::trunc(log10(traits::get_absolute_value(n)))); - } - - template - static bool dot(OutputIterator& sink, T n, unsigned precision) { - if (n == 0.0) return true; // avoid trailing zeroes - return base_type::dot(sink, n, precision); - } - - template - static bool fraction_part (OutputIterator& sink, T n - , unsigned precision_, unsigned precision) - { - // NOTE: copied from karma only to avoid trailing zeroes - // (maybe a bug ?) - - // allow for ADL to find the correct overload for floor and log10 - using namespace std; - - using namespace boost::spirit; // for traits - using namespace boost::spirit::karma; // for char_inserter - - if ( traits::test_zero(n) ) return true; // this part added to karma - - // The following is equivalent to: - // generate(sink, right_align(precision, '0')[ulong], n); - // but it's spelled out to avoid inter-modular dependencies. - - typename boost::remove_const::type digits = - (traits::test_zero(n) ? 0 : floor(log10(n))) + 1; - bool r = true; - for (/**/; r && digits < precision_; digits = digits + 1) - r = char_inserter<>::call(sink, '0'); - if (precision && r) - r = int_inserter<10>::call(sink, n); - return r; - } - - template - static bool exponent (OutputIterator& sink, long n) - { - // NOTE: copied from karma to force sign in exponent - const bool force_sign = true; - - using namespace boost::spirit; // for traits - using namespace boost::spirit::karma; // for char_inserter, sign_inserter - - unsigned long abs_n = traits::get_absolute_value(n); - bool r = char_inserter::call(sink, 'e') && - sign_inserter::call(sink, traits::test_zero(n) - , traits::test_negative(n), force_sign); - - // the C99 Standard requires at least two digits in the exponent - if (r && abs_n < 10) - r = char_inserter::call(sink, '0'); - return r && int_inserter<10>::call(sink, abs_n); - } - - }; -} - -bool to_string(std::string & str, double value) -{ - namespace karma = boost::spirit::karma; - typedef karma::real_generator > double_type; - std::back_insert_iterator sink(str); - return karma::generate(sink, double_type(), value); -} - #else bool to_string(std::string & s, int val) @@ -342,22 +263,6 @@ bool to_string(std::string & s, bool val) return true; } -bool to_string(std::string & s, double val) -{ - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast(snprintf(&s[0], s.size()+1, "%g", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return true; -} - #endif } // end namespace util diff --git a/src/css_color_grammar.cpp b/src/css_color_grammar.cpp index 6a8be6d1d..df36b5d44 100644 --- a/src/css_color_grammar.cpp +++ b/src/css_color_grammar.cpp @@ -25,7 +25,7 @@ #if BOOST_VERSION >= 104500 -#include +#include namespace mapnik { diff --git a/src/datasource_cache.cpp b/src/datasource_cache.cpp index cf8797f48..9773bb2be 100644 --- a/src/datasource_cache.cpp +++ b/src/datasource_cache.cpp @@ -25,39 +25,40 @@ #include #include #include +#include +#include // boost #include #include #include -// ltdl -#include - // stl #include -#include #include +#include namespace mapnik { -bool is_input_plugin (std::string const& filename) +extern datasource_ptr create_static_datasource(parameters const& params); +extern std::vector get_static_datasource_names(); + +bool is_input_plugin(std::string const& filename) { return boost::algorithm::ends_with(filename,std::string(".input")); } - datasource_cache::datasource_cache() { - if (lt_dlinit()) throw std::runtime_error("lt_dlinit() failed"); + PluginInfo::init(); } datasource_cache::~datasource_cache() { - lt_dlexit(); + PluginInfo::exit(); } -datasource_ptr datasource_cache::create(const parameters& params) +datasource_ptr datasource_cache::create(parameters const& params) { boost::optional type = params.get("type"); if ( ! type) @@ -66,13 +67,23 @@ datasource_ptr datasource_cache::create(const parameters& params) "parameter 'type' is missing"); } + datasource_ptr ds; + +#ifdef MAPNIK_STATIC_PLUGINS + // return if it's created, raise otherwise + ds = create_static_datasource(params); + if (ds) + { + return ds; + } +#endif + #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mutex_); #endif - datasource_ptr ds; std::map >::iterator itr=plugins_.find(*type); - if ( itr == plugins_.end() ) + if (itr == plugins_.end()) { std::string s("Could not create datasource for type: '"); s += *type + "'"; @@ -87,48 +98,47 @@ datasource_ptr datasource_cache::create(const parameters& params) throw config_error(s); } - if ( ! itr->second->handle()) + if (! itr->second->valid()) { throw std::runtime_error(std::string("Cannot load library: ") + - lt_dlerror()); + itr->second->get_error()); } // http://www.mr-edd.co.uk/blog/supressing_gcc_warnings #ifdef __GNUC__ __extension__ #endif - create_ds* create_datasource = - reinterpret_cast(lt_dlsym(itr->second->handle(), "create")); + create_ds* create_datasource = reinterpret_cast(itr->second->get_symbol("create")); if (! create_datasource) { throw std::runtime_error(std::string("Cannot load symbols: ") + - lt_dlerror()); + itr->second->get_error()); } + ds = datasource_ptr(create_datasource(params), datasource_deleter()); + #ifdef MAPNIK_LOG - MAPNIK_LOG_DEBUG(datasource_cache) << "datasource_cache: Size=" << params.size(); + MAPNIK_LOG_DEBUG(datasource_cache) + << "datasource_cache: Datasource=" + << ds << " type=" << type; + + MAPNIK_LOG_DEBUG(datasource_cache) + << "datasource_cache: Size=" + << params.size(); parameters::const_iterator i = params.begin(); for (; i != params.end(); ++i) { - MAPNIK_LOG_DEBUG(datasource_cache) << "datasource_cache: -- " << i->first << "=" << i->second; + MAPNIK_LOG_DEBUG(datasource_cache) + << "datasource_cache: -- " + << i->first << "=" << i->second; } #endif - ds = datasource_ptr(create_datasource(params), datasource_deleter()); - - MAPNIK_LOG_DEBUG(datasource_cache) << "datasource_cache: Datasource=" << ds << " type=" << type; - return ds; } -bool datasource_cache::insert(std::string const& type,const lt_dlhandle module) -{ - return plugins_.insert(std::make_pair(type,boost::make_shared - (type,module))).second; -} - std::string datasource_cache::plugin_directories() { return boost::algorithm::join(plugin_directories_,", "); @@ -137,11 +147,17 @@ std::string datasource_cache::plugin_directories() std::vector datasource_cache::plugin_names() { std::vector names; + +#ifdef MAPNIK_STATIC_PLUGINS + names = get_static_datasource_names(); +#endif + std::map >::const_iterator itr; - for (itr = plugins_.begin();itr!=plugins_.end();++itr) + for (itr = plugins_.begin(); itr != plugins_.end(); ++itr) { names.push_back(itr->first); } + return names; } @@ -150,72 +166,68 @@ void datasource_cache::register_datasources(std::string const& str) #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mutex_); #endif - boost::filesystem::path path(str); // TODO - only push unique paths plugin_directories_.push_back(str); - boost::filesystem::directory_iterator end_itr; - - if (exists(path) && is_directory(path)) + if (mapnik::util::exists(str) && mapnik::util::is_directory(str)) { - for (boost::filesystem::directory_iterator itr(path);itr!=end_itr;++itr ) + boost::filesystem::directory_iterator end_itr; + for (boost::filesystem::directory_iterator itr(str); itr != end_itr; ++itr ) { #if (BOOST_FILESYSTEM_VERSION == 3) - if (!is_directory( *itr ) && is_input_plugin(itr->path().filename().string())) + if (!boost::filesystem::is_directory(*itr) && is_input_plugin(itr->path().filename().string())) #else // v2 - if (!is_directory( *itr ) && is_input_plugin(itr->path().leaf())) + if (!boost::filesystem::is_directory(*itr) && is_input_plugin(itr->path().leaf())) +#endif + { +#if (BOOST_FILESYSTEM_VERSION == 3) + if (register_datasource(itr->path().string())) +#else // v2 + if (register_datasource(itr->string())) #endif { -#if (BOOST_FILESYSTEM_VERSION == 3) - if (register_datasource(itr->path().string())) -#else // v2 - if (register_datasource(itr->string())) -#endif - { - registered_ = true; - } + registered_ = true; } + } } } } -bool datasource_cache::register_datasource(std::string const& str) +bool datasource_cache::register_datasource(std::string const& filename) { bool success = false; try { - lt_dlhandle module = lt_dlopen(str.c_str()); - if (module) + boost::shared_ptr plugin = boost::make_shared(filename,"datasource_name"); + if (plugin->valid()) { - // http://www.mr-edd.co.uk/blog/supressing_gcc_warnings -#ifdef __GNUC__ - __extension__ -#endif - datasource_name* ds_name = - reinterpret_cast(lt_dlsym(module, "datasource_name")); - if (ds_name && insert(ds_name(),module)) - { - MAPNIK_LOG_DEBUG(datasource_cache) << "datasource_cache: Registered=" << ds_name(); - - success = true; - } - else if (!ds_name) + if (plugin->name().empty()) { MAPNIK_LOG_ERROR(datasource_cache) << "Problem loading plugin library '" - << str << "' (plugin is lacking compatible interface)"; + << filename << "' (plugin is lacking compatible interface)"; + } + else + { + plugins_.insert(std::make_pair(plugin->name(),plugin)); + MAPNIK_LOG_DEBUG(datasource_cache) + << "datasource_cache: Registered=" + << plugin->name(); + success = true; } } else { MAPNIK_LOG_ERROR(datasource_cache) - << "Problem loading plugin library: " << str - << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)"; + << "Problem loading plugin library: " + << filename << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)"; } } - catch (...) { - MAPNIK_LOG_ERROR(datasource_cache) - << "Exception caught while loading plugin library: " << str; + catch (std::exception const& ex) + { + MAPNIK_LOG_ERROR(datasource_cache) + << "Exception caught while loading plugin library: " + << filename << " (" << ex.what() << ")"; } return success; } diff --git a/src/datasource_cache_static.cpp b/src/datasource_cache_static.cpp new file mode 100644 index 000000000..07e178ca4 --- /dev/null +++ b/src/datasource_cache_static.cpp @@ -0,0 +1,172 @@ +/***************************************************************************** + * + * 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 + +#ifdef MAPNIK_STATIC_PLUGINS +#include + +// boost +#include +#include +#include +#endif + +// stl +#include + +// static plugin linkage +#ifdef MAPNIK_STATIC_PLUGINS + #if defined(MAPNIK_STATIC_PLUGIN_CSV) + #include "plugins/input/csv/csv_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_GDAL) + #include "plugins/input/gdal/gdal_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_GEOJSON) + #include "plugins/input/geojson/geojson_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_GEOS) + #include "plugins/input/geos/geos_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_KISMET) + #include "plugins/input/kismet/kismet_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_OCCI) + #include "plugins/input/occi/occi_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_OGR) + #include "plugins/input/ogr/ogr_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_OSM) + #include "plugins/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" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_RASTER) + #include "plugins/input/raster/raster_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_RASTERLITE) + #include "plugins/input/rasterlite/rasterlite_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_SHAPE) + #include "plugins/input/shape/shape_datasource.hpp" + #endif + #if defined(MAPNIK_STATIC_PLUGIN_SQLITE) + #include "plugins/input/sqlite/sqlite_datasource.hpp" + #endif +#endif + +namespace mapnik { + +#ifdef MAPNIK_STATIC_PLUGINS +template +datasource_ptr ds_generator(parameters const& params) +{ + return boost::make_shared(params); +} + +typedef datasource_ptr (*ds_generator_ptr)(parameters const& params); +typedef boost::unordered_map datasource_map; + +static datasource_map ds_map = boost::assign::map_list_of + #if defined(MAPNIK_STATIC_PLUGIN_CSV) + (std::string("csv"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_GDAL) + (std::string("gdal"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_GEOJSON) + (std::string("geojson"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_OCCI) + (std::string("occi"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_OGR) + (std::string("ogr"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_OSM) + (std::string("osm"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_POSTGIS) + (std::string("postgis"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_PYTHON) + (std::string("python"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_RASTER) + (std::string("raster"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_RASTERLITE) + (std::string("rasterlite"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_SHAPE) + (std::string("shape"), &ds_generator) + #endif + #if defined(MAPNIK_STATIC_PLUGIN_SQLITE) + (std::string("sqlite"), &ds_generator) + #endif +; +#endif + +#ifdef MAPNIK_STATIC_PLUGINS +datasource_ptr create_static_datasource(parameters const& params) +{ + datasource_ptr ds; + boost::optional type = params.get("type"); + datasource_map::iterator it = ds_map.find(*type); + if (it != ds_map.end()) + { + ds = it->second(params); + } + return ds; +} +#else +datasource_ptr create_static_datasource(parameters const& /*params*/) +{ + return datasource_ptr(); +} +#endif + +std::vector get_static_datasource_names() +{ + std::vector names; + +#ifdef MAPNIK_STATIC_PLUGINS + datasource_map::iterator it = ds_map.begin(); + while (it != ds_map.end()) + { + names.push_back(it->first); + + it++; + } +#endif + + return names; +} + +} diff --git a/src/debug.cpp b/src/debug.cpp index f0f4d4540..f9a04fbc5 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -25,9 +25,10 @@ // stl #include +#include #ifndef MAPNIK_LOG_FORMAT -#define MAPNIK_LOG_FORMAT "Mapnik LOG> %Y-%m-%d %H:%M:%S:" + #define MAPNIK_LOG_FORMAT Mapnik LOG> %Y-%m-%d %H:%M:%S: #endif #ifndef MAPNIK_DEFAULT_LOG_SEVERITY diff --git a/src/debug_symbolizer.cpp b/src/debug_symbolizer.cpp new file mode 100644 index 000000000..1b064dbca --- /dev/null +++ b/src/debug_symbolizer.cpp @@ -0,0 +1,57 @@ +/***************************************************************************** + * + * 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 +#include + +namespace mapnik +{ + +static const char * debug_symbolizer_mode_strings[] = { + "collision", + "vertex", + "" +}; + +IMPLEMENT_ENUM( debug_symbolizer_mode_e, debug_symbolizer_mode_strings ) + +debug_symbolizer::debug_symbolizer() +: symbolizer_base(), + mode_(DEBUG_SYM_MODE_COLLISION) {} + +debug_symbolizer::debug_symbolizer(debug_symbolizer const& rhs) + : symbolizer_base(rhs), + mode_(rhs.mode_) {} + +debug_symbolizer_mode_e debug_symbolizer::get_mode() const +{ + return mode_; +} + +void debug_symbolizer::set_mode(debug_symbolizer_mode_e mode) +{ + mode_ = mode; +} + +} + diff --git a/src/expression_grammar.cpp b/src/expression_grammar.cpp index 0894be1c3..294996361 100644 --- a/src/expression_grammar.cpp +++ b/src/expression_grammar.cpp @@ -21,170 +21,14 @@ *****************************************************************************/ // mapnik -#include -#include -#include -#include +#include -// boost -#include -#include -#include -#include - -// fwd declare -namespace mapnik { - struct attribute; - struct geometry_type_attribute; -} +// stl +#include namespace mapnik { -template -expr_node regex_match_impl::operator() (T0 & node, T1 const& pattern) const -{ -#if defined(BOOST_REGEX_HAS_ICU) - return regex_match_node(node,tr_.transcode(pattern.c_str())); -#else - return regex_match_node(node,pattern); -#endif -} - -template -expr_node regex_replace_impl::operator() (T0 & node, T1 const& pattern, T2 const& format) const -{ -#if defined(BOOST_REGEX_HAS_ICU) - return regex_replace_node(node,tr_.transcode(pattern.c_str()),tr_.transcode(format.c_str())); -#else - return regex_replace_node(node,pattern,format); -#endif -} - -template -expression_grammar::expression_grammar(mapnik::transcoder const& tr) - : expression_grammar::base_type(expr), - unicode_(unicode_impl(tr)), - regex_match_(regex_match_impl(tr)), - regex_replace_(regex_replace_impl(tr)) -{ - using boost::phoenix::construct; - using qi::_1; - using qi::_a; - using qi::_b; - using qi::_r1; -#if BOOST_VERSION > 104200 - using qi::no_skip; -#endif - using qi::lexeme; - using qi::_val; - using qi::lit; - using qi::double_; - using qi::hex; - using qi::omit; - using standard_wide::char_; - using standard_wide::no_case; - - expr = logical_expr.alias(); - - logical_expr = not_expr [_val = _1] - >> - *( ( ( lit("and") | lit("&&")) >> not_expr [_val && _1] ) - | (( lit("or") | lit("||")) >> not_expr [_val || _1]) - ) - ; - - not_expr = - cond_expr [_val = _1 ] - | ((lit("not") | lit('!')) >> cond_expr [ _val = !_1 ]) - ; - - cond_expr = equality_expr [_val = _1] | additive_expr [_val = _1] - ; - - equality_expr = - relational_expr [_val = _1] - >> *( ( (lit("=") | lit("eq") | lit("is")) >> relational_expr [_val == _1]) - | (( lit("!=") | lit("<>") | lit("neq") ) >> relational_expr [_val != _1]) - ) - ; - - regex_match_expr = lit(".match") - >> lit('(') - >> ustring [_val = _1] - >> lit(')') - ; - - regex_replace_expr = - lit(".replace") - >> lit('(') - >> ustring [_a = _1] - >> lit(',') - >> ustring [_b = _1] - >> lit(')') [_val = regex_replace_(_r1,_a,_b)] - ; - - relational_expr = additive_expr[_val = _1] - >> - *( ( (lit("<=") | lit("le") ) >> additive_expr [ _val <= _1 ]) - | ( (lit('<') | lit("lt") ) >> additive_expr [ _val < _1 ]) - | ( (lit(">=") | lit("ge") ) >> additive_expr [ _val >= _1 ]) - | ( (lit('>') | lit("gt") ) >> additive_expr [ _val > _1 ]) - ) - ; - - additive_expr = multiplicative_expr [_val = _1] - >> * ( '+' >> multiplicative_expr[_val += _1] - | '-' >> multiplicative_expr[_val -= _1] - ) - ; - - multiplicative_expr = unary_expr [_val = _1] - >> *( '*' >> unary_expr [_val *= _1] - | '/' >> unary_expr [_val /= _1] - | '%' >> unary_expr [_val %= _1] - | regex_match_expr[_val = regex_match_(_val, _1)] - | regex_replace_expr(_val) [_val = _1] - ) - ; - - unary_expr = primary_expr [_val = _1] - | '+' >> primary_expr [_val = _1] - | '-' >> primary_expr [_val = -_1] - ; - - primary_expr = strict_double [_val = _1] - | int__[_val = _1] - | no_case[lit("true")] [_val = true] - | no_case[lit("false")] [_val = false] - | no_case[lit("null")] [_val = value_null() ] - | no_case[geom_type][_val = _1 ] - | ustring [_val = unicode_(_1) ] - | lit("[mapnik::geometry_type]")[_val = construct()] - | attr [_val = construct( _1 ) ] - | '(' >> expr [_val = _1 ] >> ')' - ; - - unesc_char.add("\\a", '\a')("\\b", '\b')("\\f", '\f')("\\n", '\n') - ("\\r", '\r')("\\t", '\t')("\\v", '\v')("\\\\", '\\') - ("\\\'", '\'')("\\\"", '\"') - ; - -#if BOOST_VERSION > 104500 - quote_char %= char_('\'') | char_('"'); - ustring %= omit[quote_char[_a = _1]] - >> *(unesc_char | "\\x" >> hex | (char_ - lit(_a))) - >> lit(_a); - attr %= '[' >> no_skip[+~char_(']')] >> ']'; -#else - ustring %= lit('\'') - >> *(unesc_char | "\\x" >> hex | (char_ - lit('\''))) - >> lit('\''); - attr %= '[' >> lexeme[+(char_ - ']')] >> ']'; -#endif - -} - template struct mapnik::expression_grammar; } diff --git a/src/expression_string.cpp b/src/expression_string.cpp index f42d5f6cc..484d3c273 100644 --- a/src/expression_string.cpp +++ b/src/expression_string.cpp @@ -59,7 +59,7 @@ struct expression_string : boost::static_visitor str_ += "]"; } - void operator() (geometry_type_attribute const& attr) const + void operator() (geometry_type_attribute const& /*attr*/) const { str_ += "[mapnik::geometry_type]"; } diff --git a/src/feature_style_processor.cpp b/src/feature_style_processor.cpp index 9deb275ab..fd79e13a7 100644 --- a/src/feature_style_processor.cpp +++ b/src/feature_style_processor.cpp @@ -24,8 +24,11 @@ #include #include #include + +#if defined(GRID_RENDERER) #include #include +#endif #if defined(HAVE_CAIRO) #include @@ -48,7 +51,10 @@ template class feature_style_processor >; template class feature_style_processor > >; #endif +#if defined(GRID_RENDERER) template class feature_style_processor >; +#endif + template class feature_style_processor >; } diff --git a/src/feature_type_style.cpp b/src/feature_type_style.cpp index f041b714f..f850a86f8 100644 --- a/src/feature_type_style.cpp +++ b/src/feature_type_style.cpp @@ -22,6 +22,7 @@ #include #include +#include // boost #include diff --git a/src/font_engine_freetype.cpp b/src/font_engine_freetype.cpp index 1c0f686ac..f9b2f84e0 100644 --- a/src/font_engine_freetype.cpp +++ b/src/font_engine_freetype.cpp @@ -25,8 +25,15 @@ #include #include #include + +#if defined(GRID_RENDERER) #include +#endif + #include +#include +#include +#include // boost #include @@ -36,6 +43,7 @@ // stl #include #include +#include // icu #include @@ -45,7 +53,11 @@ namespace mapnik { -freetype_engine::freetype_engine() + + +freetype_engine::freetype_engine() : + library_(NULL) + { FT_Error error = FT_Init_FreeType( &library_ ); if (error) @@ -61,7 +73,7 @@ freetype_engine::~freetype_engine() bool freetype_engine::is_font_file(std::string const& file_name) { - /** only accept files that will be matched by freetype2's `figurefiletype()` */ + // only accept files that will be matched by freetype2's `figurefiletype()` std::string fn = file_name; std::transform(fn.begin(), fn.end(), fn.begin(), ::tolower); return boost::algorithm::ends_with(fn,std::string(".ttf")) || @@ -70,7 +82,7 @@ bool freetype_engine::is_font_file(std::string const& file_name) boost::algorithm::ends_with(fn,std::string(".pfa")) || boost::algorithm::ends_with(fn,std::string(".pfb")) || boost::algorithm::ends_with(fn,std::string(".ttc")) || - /** Plus OSX custom ext */ + // Plus OSX custom ext boost::algorithm::ends_with(fn,std::string(".dfont")); } @@ -107,11 +119,11 @@ bool freetype_engine::register_font(std::string const& file_name) if (face->family_name && face->style_name) { std::string name = std::string(face->family_name) + " " + std::string(face->style_name); - // skip fonts with leading . in name + // skip fonts with leading . in the name if (!boost::algorithm::starts_with(name,".")) { - success = true; name2file_.insert(std::make_pair(name, std::make_pair(i,file_name))); + success = true; } } else @@ -125,7 +137,7 @@ bool freetype_engine::register_font(std::string const& file_name) else if (face->style_name) s << "which reports a style name of '" << std::string(face->style_name) << "' and lacks a family name"; - MAPNIK_LOG_DEBUG(font_engine_freetype) << "freetype_engine: " << s.str(); + MAPNIK_LOG_ERROR(font_engine_freetype) << "register_font: " << s.str(); } } if (face) @@ -137,49 +149,55 @@ bool freetype_engine::register_font(std::string const& file_name) bool freetype_engine::register_fonts(std::string const& dir, bool recurse) { - boost::filesystem::path path(dir); - if (!boost::filesystem::exists(path)) + if (!mapnik::util::exists(dir)) { return false; } - if (!boost::filesystem::is_directory(path)) + if (!mapnik::util::is_directory(dir)) { return mapnik::freetype_engine::register_font(dir); } - boost::filesystem::directory_iterator end_itr; bool success = false; - for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr) + try { -#if (BOOST_FILESYSTEM_VERSION == 3) - std::string file_name = itr->path().string(); -#else // v2 - std::string file_name = itr->string(); -#endif - if (boost::filesystem::is_directory(*itr) && recurse) + boost::filesystem::directory_iterator end_itr; + for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr) { - if (register_fonts(file_name, true)) + #if (BOOST_FILESYSTEM_VERSION == 3) + std::string file_name = itr->path().string(); + #else // v2 + std::string file_name = itr->string(); + #endif + if (boost::filesystem::is_directory(*itr) && recurse) { - success = true; - } - } - else - { -#if (BOOST_FILESYSTEM_VERSION == 3) - std::string base_name = itr->path().filename().string(); -#else // v2 - std::string base_name = itr->filename(); -#endif - if (!boost::algorithm::starts_with(base_name,".") && - boost::filesystem::is_regular_file(file_name) && - is_font_file(file_name)) - { - if (mapnik::freetype_engine::register_font(file_name)) + if (register_fonts(file_name, true)) { success = true; } } + else + { + #if (BOOST_FILESYSTEM_VERSION == 3) + std::string base_name = itr->path().filename().string(); + #else // v2 + std::string base_name = itr->filename(); + #endif + if (!boost::algorithm::starts_with(base_name,".") && + boost::filesystem::is_regular_file(file_name) && + is_font_file(file_name)) + { + if (mapnik::freetype_engine::register_font(file_name)) + { + success = true; + } + } + } } } + catch (std::exception const& ex) + { + MAPNIK_LOG_ERROR(font_engine_freetype) << "register_fonts: " << ex.what(); + } return success; } @@ -203,18 +221,47 @@ std::map > const& freetype_engine::get_ma face_ptr freetype_engine::create_face(std::string const& family_name) { - std::map >::iterator itr; + std::map >::const_iterator itr; itr = name2file_.find(family_name); if (itr != name2file_.end()) { FT_Face face; - FT_Error error = FT_New_Face (library_, - itr->second.second.c_str(), - itr->second.first, - &face); - if (!error) + + std::map::const_iterator mem_font_itr = memory_fonts_.find(itr->second.second); + + if (mem_font_itr != memory_fonts_.end()) // memory font { - return boost::make_shared(face); + FT_Error error = FT_New_Memory_Face(library_, + (FT_Byte const*) mem_font_itr->second.c_str(), //buffer + mem_font_itr->second.size(), // size + itr->second.first, // face index + &face); + + if (!error) return boost::make_shared(face); + } + else + { + // load font into memory +#ifdef MAPNIK_THREADSAFE + mutex::scoped_lock lock(mutex_); +#endif + std::ifstream is(itr->second.second.c_str() , std::ios::binary); + std::string buffer((std::istreambuf_iterator(is)), + std::istreambuf_iterator()); + std::pair::iterator,bool> result + = memory_fonts_.insert(std::make_pair(itr->second.second, buffer)); + + FT_Error error = FT_New_Memory_Face (library_, + (FT_Byte const*) result.first->second.c_str(), + buffer.size(), + itr->second.first, + &face); + if (!error) return boost::make_shared(face); + else + { + // we can't load font, erase it. + memory_fonts_.erase(result.first); + } } } return face_ptr(); @@ -231,12 +278,36 @@ stroker_ptr freetype_engine::create_stroker() return stroker_ptr(); } -char_info font_face_set::character_dimensions(const unsigned c) +void font_face_set::add(face_ptr face) +{ + faces_.push_back(face); + dimension_cache_.clear(); //Make sure we don't use old cached data +} + +font_face_set::size_type font_face_set::size() const +{ + return faces_.size(); +} + +glyph_ptr font_face_set::get_glyph(unsigned c) const +{ + BOOST_FOREACH ( face_ptr const& face, faces_) + { + FT_UInt g = face->get_char(c); + if (g) return boost::make_shared(face, g); + } + + // Final fallback to empty square if nothing better in any font + return boost::make_shared(*faces_.begin(), 0); +} + +char_info font_face_set::character_dimensions(unsigned int c) { //Check if char is already in cache - std::map::const_iterator itr; - itr = dimension_cache_.find(c); - if (itr != dimension_cache_.end()) { + typedef std::map::const_iterator iterator_type; + iterator_type itr = dimension_cache_.find(c); + if (itr != dimension_cache_.end()) + { return itr->second; } @@ -273,8 +344,8 @@ char_info font_face_set::character_dimensions(const unsigned c) unsigned tempx = face->glyph->advance.x >> 6; - char_info dim(c, tempx, glyph_bbox.yMax, glyph_bbox.yMin, face->size->metrics.height/64.0 /* >> 6 */); - dimension_cache_.insert(std::pair(c, dim)); + char_info dim(c, tempx, glyph_bbox.yMax, glyph_bbox.yMin, face->size->metrics.height/64.0); + dimension_cache_.insert(std::make_pair(c, dim)); return dim; } @@ -325,15 +396,137 @@ void font_face_set::get_string_info(string_info & info, UnicodeString const& ust ubidi_close(bidi); } +void font_face_set::set_pixel_sizes(unsigned size) +{ + BOOST_FOREACH ( face_ptr const& face, faces_) + { + face->set_pixel_sizes(size); + } +} + +void font_face_set::set_character_sizes(double size) +{ + BOOST_FOREACH ( face_ptr const& face, faces_) + { + face->set_character_sizes(size); + } +} + + template -text_renderer::text_renderer (pixmap_type & pixmap, - face_manager & font_manager, - stroker & s, - composite_mode_e comp_op, - double scale_factor) +void composite_bitmap(T & pixmap, + FT_Bitmap *bitmap, + unsigned rgba, + int x, + int y, + double opacity, + composite_mode_e comp_op) +{ + int x_max=x+bitmap->width; + int y_max=y+bitmap->rows; + int i,p,j,q; + + for (i=x,p=0;ibuffer[q*bitmap->width+p]; + if (gray) + { + pixmap.composite_pixel(comp_op, i, j, rgba, gray, opacity); + } + } + } +} + +template +void render_halo(T & pixmap, + FT_Bitmap *bitmap, + unsigned rgba, + int x1, + int y1, + double halo_radius, + double opacity, + composite_mode_e comp_op) +{ + int width = bitmap->width; + int height = bitmap->rows; + int x, y; + if (halo_radius < 1.0) + { + for (x=0; x < width; x++) + { + for (y=0; y < height; y++) + { + 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); + + 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); + + 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); + } + } + } + } else { + for (x=0; x < width; x++) + { + for (y=0; y < height; y++) + { + int gray = bitmap->buffer[y*bitmap->width+x]; + if (gray) + { + 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); + } + } + } + } +} + +template +void render_halo_id(T & pixmap, + FT_Bitmap *bitmap, + mapnik::value_integer feature_id, + int x1, + int y1, + int halo_radius) +{ + int width = bitmap->width; + int height = bitmap->rows; + int x, y; + for (x=0; x < width; x++) + { + for (y=0; y < height; y++) + { + int gray = bitmap->buffer[y*bitmap->width+x]; + if (gray) + { + for (int n=-halo_radius; n <=halo_radius; ++n) + for (int m=-halo_radius; m <= halo_radius; ++m) + pixmap.setPixel(x+x1+m,y+y1+n,feature_id); + } + } + } +} + +template +text_renderer::text_renderer(pixmap_type & pixmap, + face_manager & font_manager, + halo_rasterizer_e rasterizer, + composite_mode_e comp_op, + double scale_factor) : pixmap_(pixmap), font_manager_(font_manager), - stroker_(s), + rasterizer_(rasterizer), comp_op_(comp_op), scale_factor_(scale_factor) {} @@ -351,12 +544,12 @@ box2d text_renderer::prepare_glyphs(text_path const& path) bbox.xMin = bbox.yMin = 32000; // Initialize these so we can tell if we bbox.xMax = bbox.yMax = -32000; // properly grew the bbox later - for (int i = 0; i < path.num_nodes(); i++) + for (int i = 0; i < path.num_nodes(); ++i) { char_info_ptr c; double x, y, angle; - path.vertex(&c, &x, &y, &angle); + path.vertex(c, x, y, angle); // TODO Enable when we have support for setting verbosity // MAPNIK_LOG_DEBUG(font_engine_freetype) << "text_renderer: prepare_glyphs=" @@ -416,27 +609,7 @@ box2d text_renderer::prepare_glyphs(text_path const& path) } template -void composite_bitmap(T & pixmap, FT_Bitmap *bitmap, unsigned rgba, int x, int y, double opacity, composite_mode_e comp_op) -{ - int x_max=x+bitmap->width; - int y_max=y+bitmap->rows; - int i,p,j,q; - - for (i=x,p=0;ibuffer[q*bitmap->width+p]; - if (gray) - { - pixmap.composite_pixel(comp_op, i, j, rgba, gray, opacity); - } - } - } -} - -template -void text_renderer::render(pixel_position pos) +void text_renderer::render(pixel_position const& pos) { FT_Error error; FT_Vector start; @@ -452,24 +625,44 @@ void text_renderer::render(pixel_position pos) double halo_radius = itr->properties->halo_radius * scale_factor_; //make sure we've got reasonable values. if (halo_radius <= 0.0 || halo_radius > 1024.0) continue; - stroker_.init(halo_radius); FT_Glyph g; error = FT_Glyph_Copy(itr->image, &g); if (!error) { FT_Glyph_Transform(g,0,&start); - FT_Glyph_Stroke(&g,stroker_.get(),1); - error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_NORMAL,0,1); - if ( ! error ) + if (rasterizer_ == HALO_RASTERIZER_FULL) { - - FT_BitmapGlyph bit = (FT_BitmapGlyph)g; - composite_bitmap(pixmap_, &bit->bitmap, itr->properties->halo_fill.rgba(), - bit->left, - height - bit->top, - itr->properties->text_opacity, - comp_op_ - ); + stroker_ptr stk = font_manager_.get_stroker(); + stk->init(halo_radius); + FT_Glyph_Stroke(&g,stk->get(),1); + error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_NORMAL,0,1); + if (!error) + { + FT_BitmapGlyph bit = (FT_BitmapGlyph)g; + composite_bitmap(pixmap_, + &bit->bitmap, + itr->properties->halo_fill.rgba(), + bit->left, + height - bit->top, + itr->properties->text_opacity, + comp_op_); + } + } + else + { + error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_NORMAL,0,1); + if (!error) + { + FT_BitmapGlyph bit = (FT_BitmapGlyph)g; + render_halo(pixmap_, + &bit->bitmap, + itr->properties->halo_fill.rgba(), + bit->left, + height - bit->top, + halo_radius, + itr->properties->text_opacity, + comp_op_); + } } } FT_Done_Glyph(g); @@ -485,13 +678,11 @@ void text_renderer::render(pixel_position pos) { FT_BitmapGlyph bit = (FT_BitmapGlyph)itr->image; - //render_bitmap(&bit->bitmap, itr->properties->fill.rgba(), - // bit->left, - // height - bit->top, itr->properties->text_opacity); - - composite_bitmap(pixmap_, &bit->bitmap, itr->properties->fill.rgba(), + composite_bitmap(pixmap_, + &bit->bitmap, + itr->properties->fill.rgba(), bit->left, - height - bit->top, + height - bit->top, itr->properties->text_opacity, comp_op_ ); @@ -499,9 +690,10 @@ void text_renderer::render(pixel_position pos) } } - +#if defined(GRID_RENDERER) template -void text_renderer::render_id(int feature_id, pixel_position pos, double min_radius) +void text_renderer::render_id(mapnik::value_integer feature_id, + pixel_position const& pos) { FT_Error error; FT_Vector start; @@ -514,37 +706,42 @@ void text_renderer::render_id(int feature_id, pixel_position pos, double min_ typename glyphs_t::iterator itr; for (itr = glyphs_.begin(); itr != glyphs_.end(); ++itr) { - stroker_.init(std::max(itr->properties->halo_radius, min_radius)); - FT_Glyph g; - error = FT_Glyph_Copy(itr->image, &g); - if (!error) + FT_Glyph_Transform(itr->image,0,&start); + error = FT_Glyph_To_Bitmap( &(itr->image),FT_RENDER_MODE_NORMAL,0,1); + if ( ! error ) { - FT_Glyph_Transform(g,0,&start); - FT_Glyph_Stroke(&g,stroker_.get(),1); - error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_NORMAL,0,1); - //error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_MONO,0,1); - if ( ! error ) - { - - FT_BitmapGlyph bit = (FT_BitmapGlyph)g; - render_bitmap_id(&bit->bitmap, feature_id, - bit->left, - height - bit->top); - } + FT_BitmapGlyph bit = (FT_BitmapGlyph)itr->image; + render_halo_id(pixmap_, + &bit->bitmap, + feature_id, + bit->left, + height - bit->top, + itr->properties->halo_radius); } - FT_Done_Glyph(g); } } +#endif #ifdef MAPNIK_THREADSAFE boost::mutex freetype_engine::mutex_; #endif std::map > freetype_engine::name2file_; -template void text_renderer::render(pixel_position); -template text_renderer::text_renderer(image_32&, face_manager&, stroker&, composite_mode_e, double); -template box2dtext_renderer::prepare_glyphs(text_path const&); +std::map freetype_engine::memory_fonts_; -template void text_renderer::render_id(int, pixel_position, double ); -template text_renderer::text_renderer(grid&, face_manager&, stroker&, composite_mode_e, double); +template text_renderer::text_renderer(image_32&, + face_manager&, + halo_rasterizer_e, + composite_mode_e, + double); +template box2dtext_renderer::prepare_glyphs(text_path const&); +template void text_renderer::render(pixel_position const&); +#if defined(GRID_RENDERER) +template void text_renderer::render_id(mapnik::value_integer, + pixel_position const&); +template text_renderer::text_renderer(grid&, + face_manager&, + halo_rasterizer_e, + composite_mode_e, double); template box2dtext_renderer::prepare_glyphs(text_path const& ); +#endif } diff --git a/src/formatting/base.cpp b/src/formatting/base.cpp index bc3be41f8..849c8f13e 100644 --- a/src/formatting/base.cpp +++ b/src/formatting/base.cpp @@ -30,13 +30,15 @@ // boost #include +// stl +#include + namespace mapnik { namespace formatting { -void node::to_xml(boost::property_tree::ptree &xml) const +void node::to_xml(boost::property_tree::ptree & /*xml*/) const { - //TODO: Should this throw a config_error? - MAPNIK_LOG_ERROR(base) << "Trying to write unsupported node type to XML."; + throw std::runtime_error("Trying to write unsupported node type to XML"); } node_ptr node::from_xml(xml_node const& xml) @@ -62,7 +64,7 @@ node_ptr node::from_xml(xml_node const& xml) } } -void node::add_expressions(expression_set &output) const +void node::add_expressions(expression_set & /*output*/) const { //Do nothing by default } diff --git a/src/fs.cpp b/src/fs.cpp new file mode 100644 index 000000000..9eb01214b --- /dev/null +++ b/src/fs.cpp @@ -0,0 +1,153 @@ +/***************************************************************************** + * + * 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 + * + *****************************************************************************/ + +//#define BOOST_FILESYSTEM_VERSION 2 + +// mapnik +#include +#include + +// boost +#include + +// stl +#include + +#if (BOOST_FILESYSTEM_VERSION <= 2) +#include + +namespace boost { +namespace filesystem { +path read_symlink(const path& p) +{ + path symlink_path; + +#ifdef BOOST_POSIX_API + for (std::size_t path_max = 64;; path_max *= 2)// loop 'til buffer is large enough + { + boost::scoped_array buf(new char[path_max]); + ssize_t result; + if ((result=::readlink(p.string().c_str(), buf.get(), path_max))== -1) + { + throw std::runtime_error("could not read symlink"); + } + else + { + if(result != static_cast(path_max)) + { + symlink_path.assign(buf.get(), buf.get() + result); + break; + } + } + } +#endif + return symlink_path; +} +} +} +#endif + +namespace mapnik { + +namespace util { + + bool exists(std::string const& filepath) + { +#ifdef _WINDOWS + return boost::filesystem::exists(mapnik::utf8_to_utf16(filepath)); +#else + return boost::filesystem::exists(filepath); +#endif + } + + bool is_directory(std::string const& filepath) + { +#ifdef _WINDOWS + return boost::filesystem::is_directory(mapnik::utf8_to_utf16(filepath)); +#else + return boost::filesystem::is_directory(filepath); +#endif + } + + bool remove(std::string const& filepath) + { +#ifdef _WINDOWS + return boost::filesystem::remove(mapnik::utf8_to_utf16(filepath)); +#else + return boost::filesystem::remove(filepath); +#endif + } + + bool is_relative(std::string const& filepath) + { + +#ifdef _WINDOWS + boost::filesystem::path child_path(mapnik::utf8_to_utf16(filepath)); +#else + boost::filesystem::path child_path(filepath); +#endif + 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 + boost::filesystem::path absolute_path(mapnik::utf8_to_utf16(base)); +#else + boost::filesystem::path absolute_path(base); +#endif + // support symlinks + if (boost::filesystem::is_symlink(absolute_path)) + { + absolute_path = boost::filesystem::read_symlink(absolute_path); + } +#if (BOOST_FILESYSTEM_VERSION == 3) + return boost::filesystem::absolute(absolute_path.parent_path() / filepath).string(); +#else + return boost::filesystem::complete(absolute_path.branch_path() / filepath).normalize().string(); +#endif + } + + std::string make_absolute(std::string const& filepath, std::string const& base) + { +#if (BOOST_FILESYSTEM_VERSION == 3) + // TODO - normalize is now deprecated, use make_preferred? + return boost::filesystem::absolute(boost::filesystem::path(base)/filepath).string(); +#else // v2 + return boost::filesystem::complete(boost::filesystem::path(base)/filepath).normalize().string(); +#endif + } + + std::string dirname(std::string const& filepath) + { + boost::filesystem::path bp(filepath); +#if (BOOST_FILESYSTEM_VERSION == 3) + return bp.parent_path().string(); +#else // v2 + return bp.branch_path().string(); +#endif + } + +} // end namespace util + +} // end namespace mapnik diff --git a/src/gamma_method.cpp b/src/gamma_method.cpp index 4a7fad31f..f1adf99e2 100644 --- a/src/gamma_method.cpp +++ b/src/gamma_method.cpp @@ -22,6 +22,7 @@ // mapnik #include +#include namespace mapnik { diff --git a/src/gradient.cpp b/src/gradient.cpp index d8f6276f3..41612833b 100644 --- a/src/gradient.cpp +++ b/src/gradient.cpp @@ -21,6 +21,7 @@ *****************************************************************************/ #include +#include namespace mapnik { @@ -34,6 +35,14 @@ static const char * gradient_strings[] = { IMPLEMENT_ENUM( gradient_e, gradient_strings ) +static const char * gradient_unit_strings[] = { + "user-space-on-use", + "user-space-on-use-bounding-box", + "object-bounding-box", + "" +}; + +IMPLEMENT_ENUM( gradient_unit_e, gradient_unit_strings ) gradient::gradient() : gradient_type_(NO_GRADIENT), diff --git a/src/graphics.cpp b/src/graphics.cpp index 06dfce493..cf55b37c3 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -30,6 +30,7 @@ // agg #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" // boost #include @@ -45,19 +46,22 @@ image_32::image_32(int width,int height) :width_(width), height_(height), data_(width,height), - painted_(false) {} + painted_(false), + premultiplied_(false) {} image_32::image_32(const image_32& rhs) :width_(rhs.width_), height_(rhs.height_), data_(rhs.data_), - painted_(rhs.painted_) {} + 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_) + data_(width_, height_), + premultiplied_(false) { painted_ = true; if ( cairo_image_surface_get_format(&*surface) != CAIRO_FORMAT_ARGB32) @@ -193,13 +197,15 @@ 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 pixf(buffer); + 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) diff --git a/src/grid/grid_renderer.cpp b/src/grid/grid_renderer.cpp index 8510bd563..5a9e58868 100644 --- a/src/grid/grid_renderer.cpp +++ b/src/grid/grid_renderer.cpp @@ -39,12 +39,13 @@ #include #include #include +#include #include #include #include +#include // boost -#include #include // agg @@ -71,6 +72,24 @@ grid_renderer::grid_renderer(Map const& m, T & pixmap, double scale_factor, u setup(m); } +template +grid_renderer::grid_renderer(Map const& m, request const& req, T & pixmap, double scale_factor, unsigned offset_x, unsigned offset_y) + : feature_style_processor(m, scale_factor), + pixmap_(pixmap), + width_(pixmap_.width()), + height_(pixmap_.height()), + scale_factor_(scale_factor), + // NOTE: can change this to m dims instead of pixmap_ if render-time + // resolution support is dropped from grid_renderer python interface + t_(pixmap_.width(),pixmap_.height(),req.extent(),offset_x,offset_y), + font_engine_(), + font_manager_(font_engine_), + detector_(boost::make_shared(box2d(-req.buffer_size(), -req.buffer_size(), req.width() + req.buffer_size() ,req.height() + req.buffer_size()))), + ras_ptr(new grid_rasterizer) +{ + setup(m); +} + template void grid_renderer::setup(Map const& m) { @@ -90,7 +109,7 @@ void grid_renderer::start_map_processing(Map const& m) } template -void grid_renderer::end_map_processing(Map const& m) +void grid_renderer::end_map_processing(Map const& /*m*/) { MAPNIK_LOG_DEBUG(grid_renderer) << "grid_renderer: End map processing"; } @@ -121,7 +140,7 @@ void grid_renderer::end_layer_processing(layer const&) } template -void grid_renderer::render_marker(mapnik::feature_impl & feature, unsigned int step, pixel_position const& pos, marker const& marker, agg::trans_affine const& tr, double opacity, composite_mode_e comp_op) +void grid_renderer::render_marker(mapnik::feature_impl & feature, unsigned int step, pixel_position const& pos, marker const& marker, agg::trans_affine const& tr, double opacity, composite_mode_e /*comp_op*/) { if (marker.is_vector()) { @@ -179,8 +198,11 @@ void grid_renderer::render_marker(mapnik::feature_impl & feature, unsigned in // TODO - remove support for step != or add support for agg scaling with opacity double ratio = (1.0/step); image_data_32 target(ratio * data.width(), ratio * data.height()); - mapnik::scale_image_agg(target,data, SCALING_NEAR, - scale_factor_, 0.0, 0.0, 1.0, ratio); + mapnik::scale_image_agg(target, + data, + SCALING_NEAR, + ratio, + ratio); pixmap_.set_rectangle(feature.id(), target, boost::math::iround(pos.x - cx), boost::math::iround(pos.y - cy)); diff --git a/src/grid/process_line_symbolizer.cpp b/src/grid/process_line_symbolizer.cpp index 88fa3d13a..c188b6473 100644 --- a/src/grid/process_line_symbolizer.cpp +++ b/src/grid/process_line_symbolizer.cpp @@ -80,6 +80,7 @@ void grid_renderer::process(line_symbolizer const& sym, padding *= half_stroke; if (std::fabs(sym.offset()) > 0) padding *= std::fabs(sym.offset()) * 1.2; + padding *= scale_factor_; clipping_extent.pad(padding); } diff --git a/src/grid/process_markers_symbolizer.cpp b/src/grid/process_markers_symbolizer.cpp index 1cf09ead5..e04b3d53c 100644 --- a/src/grid/process_markers_symbolizer.cpp +++ b/src/grid/process_markers_symbolizer.cpp @@ -65,7 +65,6 @@ porting notes --> // agg #include "agg_basics.h" #include "agg_rendering_buffer.h" -#include "agg_pixfmt_rgba.h" #include "agg_rasterizer_scanline_aa.h" // boost @@ -167,7 +166,7 @@ void grid_renderer::process(markers_symbolizer const& sym, else { box2d const& bbox = (*mark)->bounding_box(); - setup_transform_scaling(tr, bbox, feature, sym); + setup_transform_scaling(tr, bbox.width(), bbox.height(), feature, sym); evaluate_transform(tr, feature, sym.get_image_transform()); // TODO - clamping to >= 4 pixels coord2d center = bbox.center(); @@ -209,9 +208,9 @@ void grid_renderer::process(markers_symbolizer const& sym, } else // raster markers { - box2d const& bbox = (*mark)->bounding_box(); - setup_transform_scaling(tr, bbox, feature, sym); + setup_transform_scaling(tr, (*mark)->width(), (*mark)->height(), feature, sym); evaluate_transform(tr, feature, sym.get_image_transform()); + box2d const& bbox = (*mark)->bounding_box(); // - clamp sizes to > 4 pixels of interactivity coord2d center = bbox.center(); agg::trans_affine_translation recenter(-center.x, -center.y); diff --git a/src/grid/process_point_symbolizer.cpp b/src/grid/process_point_symbolizer.cpp index 55d104861..f0230825f 100644 --- a/src/grid/process_point_symbolizer.cpp +++ b/src/grid/process_point_symbolizer.cpp @@ -33,6 +33,7 @@ #include #include #include +#include // agg #include "agg_trans_affine.h" @@ -73,7 +74,7 @@ void grid_renderer::process(point_symbolizer const& sym, agg::trans_affine_translation recenter(-center.x, -center.y); agg::trans_affine recenter_tr = recenter * tr; - box2d label_ext = bbox * recenter_tr; + box2d label_ext = bbox * recenter_tr * agg::trans_affine_scaling(scale_factor_) ; for (unsigned i=0; i #include #include +#include +#include // agg #include "agg_trans_affine.h" @@ -50,7 +52,7 @@ void grid_renderer::process(shield_symbolizer const& sym, text_renderer ren(pixmap_, font_manager_, - *(font_manager_.get_stroker()), + sym.get_halo_rasterizer(), sym.comp_op(), scale_factor_); @@ -78,7 +80,7 @@ void grid_renderer::process(shield_symbolizer const& sym, sym.comp_op()); ren.prepare_glyphs(placements[ii]); - ren.render_id(feature.id(), placements[ii].center, 2); + ren.render_id(feature.id(), placements[ii].center); } } if (placement_found) diff --git a/src/grid/process_text_symbolizer.cpp b/src/grid/process_text_symbolizer.cpp index 4b4af86b3..40e6ed5a3 100644 --- a/src/grid/process_text_symbolizer.cpp +++ b/src/grid/process_text_symbolizer.cpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace mapnik { @@ -43,7 +44,7 @@ void grid_renderer::process(text_symbolizer const& sym, text_renderer ren(pixmap_, font_manager_, - *(font_manager_.get_stroker()), + sym.get_halo_rasterizer(), sym.comp_op(), scale_factor_); @@ -53,7 +54,7 @@ void grid_renderer::process(text_symbolizer const& sym, for (unsigned int ii = 0; ii < placements.size(); ++ii) { ren.prepare_glyphs(placements[ii]); - ren.render_id(feature.id(), placements[ii].center, 2); + ren.render_id(feature.id(), placements[ii].center); } } if (placement_found) pixmap_.add_feature(feature); diff --git a/src/image_compositing.cpp b/src/image_compositing.cpp index f17a36881..e6c7b147a 100644 --- a/src/image_compositing.cpp +++ b/src/image_compositing.cpp @@ -34,6 +34,7 @@ #include "agg_scanline_u.h" #include "agg_renderer_scanline.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" namespace mapnik { @@ -139,6 +140,12 @@ void composite(T1 & dst, T2 & src, composite_mode_e mode, ren.blend_from(pixf_mask,0,dx,dy,unsigned(255*opacity)); } -template void composite(mapnik::image_data_32&, mapnik::image_data_32& ,composite_mode_e, float, int, int, bool); +template void composite(mapnik::image_data_32&, + mapnik::image_data_32&, + composite_mode_e, + float, + int, + int, + bool); } diff --git a/src/image_filter_grammar.cpp b/src/image_filter_grammar.cpp index 1601b2904..a17191d14 100644 --- a/src/image_filter_grammar.cpp +++ b/src/image_filter_grammar.cpp @@ -22,7 +22,6 @@ // mapnik #include -#include // boost #include @@ -44,11 +43,21 @@ image_filter_grammar::image_filter_grammar() using qi::_1; using qi::_a; using qi::_b; + using qi::_c; + using qi::_d; + using qi::_e; + using qi::_f; + using qi::_g; + using qi::_h; + using qi::_r1; using qi::eps; using qi::char_; + using qi::lexeme; + using qi::double_; + using boost::spirit::ascii::string; using phoenix::push_back; using phoenix::construct; - + using phoenix::at_c; #if BOOST_VERSION >= 104700 using qi::no_skip; start = -(filter % no_skip[*char_(", ")]) @@ -59,31 +68,61 @@ image_filter_grammar::image_filter_grammar() #endif filter = - lit("emboss")[push_back(_val,construct())] + lit("emboss") >> no_args [push_back(_val,construct())] | - lit("blur")[push_back(_val,construct())] + lit("blur") >> no_args [push_back(_val,construct())] | - lit("gray")[push_back(_val,construct())] + lit("gray") >> no_args [push_back(_val,construct())] | - lit("edge-detect")[push_back(_val,construct())] + lit("edge-detect") >> no_args [push_back(_val,construct())] | - lit("sobel")[push_back(_val,construct())] + lit("sobel") >> no_args [push_back(_val,construct())] | - lit("sharpen")[push_back(_val,construct())] + lit("sharpen") >> no_args [push_back(_val,construct())] | - lit("x-gradient")[push_back(_val,construct())] + lit("x-gradient") >> no_args [push_back(_val,construct())] | - lit("y-gradient")[push_back(_val,construct())] + lit("y-gradient") >> no_args [push_back(_val,construct())] | - (lit("agg-stack-blur")[_a = 1, _b = 1] - >> -( lit('(') >> radius_[_a = _1] - >> lit(',') - >> radius_[_b = _1] - >> lit(')')) - [push_back(_val,construct(_a,_b))]) + lit("invert") >> no_args [push_back(_val,construct())] | - lit("invert")[push_back(_val,construct())] + agg_blur_filter(_val) + | + scale_hsla_filter(_val) + | + colorize_alpha_filter(_val) ; + + agg_blur_filter = lit("agg-stack-blur")[_a = 1, _b = 1] + >> -( lit('(') >> -( radius_[_a = _1][_b = _1] + >> -(lit(',') >> radius_[_b = _1])) + >> lit(')')) + [push_back(_r1,construct(_a,_b))] + ; + + scale_hsla_filter = lit("scale-hsla") + >> lit('(') + >> double_[_a = _1] >> lit(',') >> double_[_b = _1] >> lit(',') + >> double_[_c = _1] >> lit(',') >> double_[_d = _1] >> lit(',') + >> double_[_e = _1] >> lit(',') >> double_[_f = _1] >> lit(',') + >> double_[_g = _1] >> lit(',') >> double_[_h = _1] >> lit(')') + [push_back(_r1, construct(_a,_b,_c,_d,_e,_f,_g,_h))] + ; + + colorize_alpha_filter = lit("colorize-alpha")[_a = construct()] + >> lit('(') + >> (css_color_[at_c<0>(_b) = _1, at_c<1>(_b) = 0] + >> -color_stop_offset(_b)) [push_back(_a,_b)] + >> +(lit(',') >> css_color_[at_c<0>(_b) =_1,at_c<1>(_b) = 0] + >> -color_stop_offset(_b))[push_back(_a,_b)] + >> lit(')') [push_back(_r1,_a)] + ; + + color_stop_offset = (double_ >> lit('%'))[at_c<1>(_r1) = percent_offset(_1)] + | + double_[at_c<1>(_r1) = _1] + ; + no_args = -(lit('(') >> lit(')')); } template struct mapnik::image_filter_grammar >; diff --git a/src/image_filter_types.cpp b/src/image_filter_types.cpp index cfb8cc0dc..9ffa0ad91 100644 --- a/src/image_filter_types.cpp +++ b/src/image_filter_types.cpp @@ -21,6 +21,7 @@ *****************************************************************************/ // mapnik #include +#include // image_filter_grammar // boost #include @@ -33,28 +34,6 @@ namespace mapnik { namespace filter { -template -struct to_string_visitor : boost::static_visitor -{ - to_string_visitor(Out & out) - : out_(out) {} - - template - void operator () (T const& filter_tag) - { - out_ << filter_tag; - } - - Out & out_; -}; - -inline std::ostream& operator<< (std::ostream& os, filter_type const& filter) -{ - to_string_visitor visitor(os); - boost::apply_visitor(visitor, filter); - return os; -} - bool generate_image_filters(std::back_insert_iterator& sink, std::vector const& filters) { using boost::spirit::karma::stream; @@ -63,4 +42,17 @@ bool generate_image_filters(std::back_insert_iterator& sink, std::v return r; } +bool parse_image_filters(std::string const& filters, std::vector& image_filters) +{ + std::string::const_iterator itr = filters.begin(); + std::string::const_iterator end = filters.end(); + mapnik::image_filter_grammar > filter_grammar; + bool r = boost::spirit::qi::phrase_parse(itr,end, + filter_grammar, + boost::spirit::qi::ascii::space, + image_filters); + return r && itr==end; +} + }} diff --git a/src/image_reader.cpp b/src/image_reader.cpp index 22e476e27..539221040 100644 --- a/src/image_reader.cpp +++ b/src/image_reader.cpp @@ -27,15 +27,67 @@ namespace mapnik { + typedef factory ImageReaderFactory; +typedef factory MemImageReaderFactory; + + +inline boost::optional type_from_bytes(char const* data, size_t size) +{ + typedef boost::optional result_type; + if (size >= 4) + { + unsigned int magic = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; + if (magic == 0x89504E47U) + { + return result_type("png"); + } + else if (magic == 0x49492A00 || magic == 0x4D4D002A) + { + return result_type("tiff"); + } + } + if (size>=2) + { + unsigned int magic = ((data[0] << 8) | data[1]) & 0xffff; + if (magic == 0xffd8) + { + return result_type("jpeg"); + } + } + + if (size>=12) + { + if (data[0] == 'R' && data[1] == 'I' && data[2] == 'F' && data[3] == 'F' && + data[8] == 'W' && data[9] == 'E' && data[10] == 'B' && data[11] == 'P') + { + return result_type("webp"); + } + } + return result_type(); +} bool register_image_reader(std::string const& type,image_reader* (* fun)(std::string const&)) { return ImageReaderFactory::instance().register_product(type,fun); } +bool register_image_reader(std::string const& type,image_reader* (* fun)(char const*, std::size_t)) +{ + return MemImageReaderFactory::instance().register_product(type,fun); +} + +image_reader* get_image_reader(char const* data, size_t size) +{ + boost::optional type = type_from_bytes(data,size); + if (type) + return MemImageReaderFactory::instance().create_object(*type, data,size); + return 0; +} + image_reader* get_image_reader(std::string const& filename,std::string const& type) { return ImageReaderFactory::instance().create_object(type,filename); diff --git a/src/image_scaling.cpp b/src/image_scaling.cpp index 200c55c05..c6b32b2d7 100644 --- a/src/image_scaling.cpp +++ b/src/image_scaling.cpp @@ -33,6 +33,7 @@ // agg #include "agg_image_accessors.h" #include "agg_pixfmt_rgba.h" +#include "agg_color_rgba.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_renderer_scanline.h" #include "agg_rendering_buffer.h" @@ -258,11 +259,11 @@ template void scale_image_agg(Image & target, Image const& source, scaling_method_e scaling_method, - double image_ratio, + double image_ratio_x, + double image_ratio_y, double x_off_f, double y_off_f, - double filter_radius, - double ratio) + double filter_radius) { // "the image filters should work namely in the premultiplied color space" // http://old.nabble.com/Re:--AGG--Basic-image-transformations-p1110665.html @@ -291,7 +292,7 @@ void scale_image_agg(Image & target, // create a scaling matrix agg::trans_affine img_mtx; - img_mtx /= agg::trans_affine_scaling(image_ratio * ratio, image_ratio * ratio); + img_mtx /= agg::trans_affine_scaling(image_ratio_x, image_ratio_y); // create a linear interpolator for our scaling matrix typedef agg::span_interpolator_linear<> interpolator_type; @@ -367,7 +368,14 @@ void scale_image_agg(Image & target, agg::render_scanlines_aa(ras, sl, rb_dst_pre, sa, sg); } -template void scale_image_agg (image_data_32& target,const image_data_32& source, scaling_method_e scaling_method, double scale_factor, double x_off_f, double y_off_f, double filter_radius, double ratio); +template void scale_image_agg(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_radius); template void scale_image_bilinear_old (image_data_32& target,const image_data_32& source, double x_off_f, double y_off_f); diff --git a/src/image_util.cpp b/src/image_util.cpp index 8738493f9..7d6759243 100644 --- a/src/image_util.cpp +++ b/src/image_util.cpp @@ -40,6 +40,10 @@ extern "C" #include #endif +#if defined(HAVE_WEBP) +#include +#endif + #include #include #include @@ -237,6 +241,73 @@ void handle_png_options(std::string const& type, } #endif + +#if defined(HAVE_WEBP) +void handle_webp_options(std::string const& type, + double & quality, + int & method, + int & lossless, + int & image_hint + ) +{ + if (type == "webp") + { + return; + } + if (type.length() > 4){ + boost::char_separator sep(":"); + boost::tokenizer< boost::char_separator > tokens(type, sep); + BOOST_FOREACH(std::string t, tokens) + { + if (boost::algorithm::starts_with(t, "quality=")) + { + std::string val = t.substr(8); + if (!val.empty()) + { + if (!mapnik::util::string2double(val,quality) || quality < 0.0 || quality > 100.0) + { + throw ImageWriterException("invalid webp quality: '" + val + "'"); + } + } + } + else if (boost::algorithm::starts_with(t, "method=")) + { + std::string val = t.substr(7); + if (!val.empty()) + { + if (!mapnik::util::string2int(val,method) || method < 0 || 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 (!mapnik::util::string2int(val,lossless) || lossless < 0 || lossless > 1) + { + throw ImageWriterException("invalid webp lossless: '" + val + "'"); + } + } + } + else if (boost::algorithm::starts_with(t, "image_hint=")) + { + std::string val = t.substr(11); + if (!val.empty()) + { + if (!mapnik::util::string2int(val,image_hint) || image_hint < 0 || image_hint > 3) + { + throw ImageWriterException("invalid webp image_hint: '" + val + "'"); + } + } + } + } + } +} +#endif + template void save_to_stream(T const& image, std::ostream & stream, @@ -369,6 +440,26 @@ void save_to_stream(T const& image, save_as_jpeg(stream, quality, image); #else throw ImageWriterException("jpeg output is not enabled in your build of Mapnik"); +#endif + } + else if (boost::algorithm::starts_with(t, "webp")) + { +#if defined(HAVE_WEBP) + double quality = 90.0; // 0 lowest, 100 highest + int method = 3; // 0 if fastest, 6 slowest + int lossless = 0; // Lossless encoding (0=lossy(default), 1=lossless). + int image_hint = 3; // used when lossless=1 + /* + WEBP_HINT_DEFAULT = 0, // default preset. + WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot + WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting + WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc). + WEBP_HINT_LAST + */ + handle_webp_options(t,quality,method,lossless, image_hint); + save_as_webp(stream, static_cast(quality), method, lossless, image_hint, image); +#else + throw ImageWriterException("webp output is not enabled in your build of Mapnik"); #endif } else throw ImageWriterException("unknown file type: " + type); @@ -400,12 +491,12 @@ void save_to_file(T const& image, std::string const& filename, rgba_palette cons #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) +void save_to_cairo_file(mapnik::Map const& map, std::string const& filename, double scale_factor, double scale_denominator) { boost::optional type = type_from_filename(filename); if (type) { - save_to_cairo_file(map,filename,*type,scale_factor); + save_to_cairo_file(map,filename,*type,scale_factor,scale_denominator); } else throw ImageWriterException("Could not write file to " + filename ); } @@ -413,7 +504,8 @@ void save_to_cairo_file(mapnik::Map const& map, std::string const& filename, dou void save_to_cairo_file(mapnik::Map const& map, std::string const& filename, std::string const& type, - double scale_factor) + double scale_factor, + double scale_denominator) { std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary); if (file) @@ -467,7 +559,7 @@ void save_to_cairo_file(mapnik::Map const& map, */ mapnik::cairo_renderer ren(map, create_context(surface), scale_factor); - ren.apply(); + ren.apply(scale_denominator); if (type == "ARGB32" || type == "RGB24") { diff --git a/src/jpeg_reader.cpp b/src/jpeg_reader.cpp index 1b3eab6c1..ac9fd7281 100644 --- a/src/jpeg_reader.cpp +++ b/src/jpeg_reader.cpp @@ -23,7 +23,6 @@ // mapnik #include #include -#include // jpeg extern "C" @@ -32,142 +31,283 @@ extern "C" } // boost +#include #include +#include +#include +#include // std #include namespace mapnik { -class JpegReader : public image_reader, mapnik::noncopyable + +template +class jpeg_reader : public image_reader { +public: + typedef T source_type; + typedef boost::iostreams::stream input_stream; + const static unsigned BUF_SIZE = 4096; private: - std::string fileName_; + struct jpeg_stream_wrapper + { + jpeg_source_mgr manager; + input_stream * stream; + JOCTET buffer[BUF_SIZE]; + }; + + struct jpeg_info_guard + { + jpeg_info_guard(jpeg_decompress_struct * cinfo) + : i_(cinfo) {} + + ~jpeg_info_guard() + { + jpeg_destroy_decompress(i_); + } + jpeg_decompress_struct * i_; + }; + +private: + source_type source_; + input_stream stream_; unsigned width_; unsigned height_; public: - explicit JpegReader(std::string const& fileName); - ~JpegReader(); + 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 premultiplied_alpha() const { return true; } void read(unsigned x,unsigned y,image_data_32& image); private: void init(); + static void on_error(j_common_ptr cinfo); + static void on_error_message(j_common_ptr cinfo); + static void init_source(j_decompress_ptr cinfo); + static boolean fill_input_buffer(j_decompress_ptr cinfo); + static void skip(j_decompress_ptr cinfo, long count); + static void term(j_decompress_ptr cinfo); + static void attach_stream(j_decompress_ptr cinfo, input_stream* in); }; namespace { -image_reader* createJpegReader(std::string const& file) +image_reader* create_jpeg_reader(std::string const& file) { - return new JpegReader(file); -} -const bool registered = register_image_reader("jpeg",createJpegReader); + return new jpeg_reader(file); } -JpegReader::JpegReader(std::string const& fileName) - : fileName_(fileName), +image_reader* create_jpeg_reader2(char const* data, size_t size) +{ + return new jpeg_reader(data, size); +} + +const bool registered = register_image_reader("jpeg",create_jpeg_reader); +const bool registered2 = register_image_reader("jpeg",create_jpeg_reader2); +} + +// ctors +template +jpeg_reader::jpeg_reader(std::string const& file_name) + : source_(file_name,std::ios_base::in | std::ios_base::binary), + stream_(source_), width_(0), height_(0) { + if (!stream_) throw image_reader_exception("cannot open image file "+ file_name); init(); } -JpegReader::~JpegReader() {} - -void JpegReader::init() +template +jpeg_reader::jpeg_reader(char const* data, size_t size) + : source_(data, size), + stream_(source_), + width_(0), + height_(0) { - FILE *fp = fopen(fileName_.c_str(),"rb"); - if (!fp) throw image_reader_exception("JPEG Reader: cannot open image file " + fileName_); + if (!stream_) throw image_reader_exception("cannot open image stream"); + init(); +} - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; +// dtor +template +jpeg_reader::~jpeg_reader() {} +// jpeg stream wrapper +template +void jpeg_reader::init_source (j_decompress_ptr cinfo) +{ + jpeg_stream_wrapper* wrap = reinterpret_cast(cinfo->src); + wrap->stream->seekg(0,std::ios_base::beg); +} + +template +boolean jpeg_reader::fill_input_buffer (j_decompress_ptr cinfo) +{ + jpeg_stream_wrapper* wrap = reinterpret_cast(cinfo->src); + wrap->stream->read(reinterpret_cast(&wrap->buffer[0]),BUF_SIZE); + std::streamsize size = wrap->stream->gcount(); + wrap->manager.next_input_byte = wrap->buffer; + wrap->manager.bytes_in_buffer = BUF_SIZE; + return (size > 0) ? TRUE : FALSE; +} + +template +void jpeg_reader::skip(j_decompress_ptr cinfo, long count) +{ + if (count <= 0) return; //A zero or negative skip count should be treated as a no-op. + jpeg_stream_wrapper* wrap = reinterpret_cast(cinfo->src); + + if (wrap->manager.bytes_in_buffer > 0u + && static_cast(count) < wrap->manager.bytes_in_buffer) + { + wrap->manager.bytes_in_buffer -= count; + wrap->manager.next_input_byte = &wrap->buffer[BUF_SIZE - wrap->manager.bytes_in_buffer]; + } + else + { + wrap->stream->seekg(count, std::ios_base::cur); + // trigger buffer fill + wrap->manager.next_input_byte = 0; + wrap->manager.bytes_in_buffer = 0; //bytes_in_buffer may be zero on return. + } +} + +template +void jpeg_reader::term (j_decompress_ptr /*cinfo*/) +{ +// no-op +} + +template +void jpeg_reader::attach_stream (j_decompress_ptr cinfo, input_stream* in) +{ + if (cinfo->src == 0) + { + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(jpeg_stream_wrapper)); + } + typename jpeg_reader::jpeg_stream_wrapper * src = reinterpret_cast (cinfo->src); + src->manager.init_source = init_source; + src->manager.fill_input_buffer = fill_input_buffer; + src->manager.skip_input_data = skip; + src->manager.resync_to_restart = jpeg_resync_to_restart; + src->manager.term_source = term; + src->manager.bytes_in_buffer = 0; + src->manager.next_input_byte = 0; + src->stream = in; +} + +template +void jpeg_reader::on_error(j_common_ptr /*cinfo*/) +{ +} + +template +void jpeg_reader::on_error_message(j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + (*cinfo->err->format_message)(cinfo, buffer); + throw image_reader_exception(std::string("JPEG Reader: libjpeg could not read image: ") + buffer); +} + +template +void jpeg_reader::init() +{ + jpeg_decompress_struct cinfo; + jpeg_info_guard iguard(&cinfo); + jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); - + jerr.error_exit = on_error; + jerr.output_message = on_error_message; jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, fp); - jpeg_read_header(&cinfo, TRUE); - + attach_stream(&cinfo, &stream_); + int ret = jpeg_read_header(&cinfo, TRUE); + if (ret != JPEG_HEADER_OK) + throw image_reader_exception("JPEG Reader: failed to read header"); jpeg_start_decompress(&cinfo); width_ = cinfo.output_width; height_ = cinfo.output_height; - // if enabled: "Application transferred too few scanlines" - //jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - fclose(fp); + + if (cinfo.out_color_space == JCS_UNKNOWN) + { + throw image_reader_exception("JPEG Reader: failed to read unknown color space"); + } + if (cinfo.output_width == 0 || cinfo.output_height == 0) + { + throw image_reader_exception("JPEG Reader: failed to read image size of"); + } } -unsigned JpegReader::width() const +template +unsigned jpeg_reader::width() const { return width_; } -unsigned JpegReader::height() const +template +unsigned jpeg_reader::height() const { return height_; } -void JpegReader::read(unsigned x0, unsigned y0, image_data_32& image) +template +void jpeg_reader::read(unsigned x0, unsigned y0, image_data_32& image) { - struct jpeg_decompress_struct cinfo; + stream_.clear(); + stream_.seekg(0, std::ios_base::beg); - FILE *fp = fopen(fileName_.c_str(),"rb"); - if (!fp) throw image_reader_exception("JPEG Reader: cannot open image file " + fileName_); - - struct jpeg_error_mgr jerr; + jpeg_decompress_struct cinfo; + jpeg_info_guard iguard(&cinfo); + jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); - + jerr.error_exit = on_error; + jerr.output_message = on_error_message; jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, fp); - - jpeg_read_header(&cinfo, TRUE); - if (cinfo.out_color_space == JCS_UNKNOWN) - throw image_reader_exception("JPEG Reader: failed to read unknown color space in " + fileName_); - + attach_stream(&cinfo, &stream_); + int ret = jpeg_read_header(&cinfo, TRUE); + if (ret != JPEG_HEADER_OK) throw image_reader_exception("JPEG Reader read(): failed to read header"); jpeg_start_decompress(&cinfo); - - if (cinfo.output_width == 0) { - jpeg_destroy_decompress (&cinfo); - fclose(fp); - throw image_reader_exception("JPEG Reader: failed to read image size of " + fileName_); - } - JSAMPARRAY buffer; int row_stride; unsigned char a,r,g,b; row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); - unsigned w = std::min(unsigned(image.width()),width_); - unsigned h = std::min(unsigned(image.height()),height_); + unsigned w = std::min(unsigned(image.width()),width_ - x0); + unsigned h = std::min(unsigned(image.height()),height_ - y0); boost::scoped_array out_row(new unsigned int[w]); - // TODO - handle x0 - for (unsigned i=0;i=y0 && i= y0 && row < y0 + h) { - for (unsigned int x=0; x 2) { - g = buffer[0][cinfo.output_components*x+1]; - b = buffer[0][cinfo.output_components*x+2]; + g = buffer[0][cinfo.output_components * col + 1]; + b = buffer[0][cinfo.output_components * col + 2]; } else { g = r; b = r; } out_row[x] = color(r, g, b, a).rgba(); } - image.setRow(i-y0, out_row.get(), w); + image.setRow(row - y0, out_row.get(), w); } + ++row; } jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - fclose(fp); } + } diff --git a/src/json/feature_collection_parser.cpp b/src/json/feature_collection_parser.cpp index 97b753480..0e1ce124e 100644 --- a/src/json/feature_collection_parser.cpp +++ b/src/json/feature_collection_parser.cpp @@ -35,6 +35,9 @@ #include #include +// stl +#include + namespace mapnik { namespace json { #if BOOST_VERSION >= 104700 diff --git a/src/json/feature_grammar.cpp b/src/json/feature_grammar.cpp index aa83162bc..2930490be 100644 --- a/src/json/feature_grammar.cpp +++ b/src/json/feature_grammar.cpp @@ -134,15 +134,18 @@ feature_grammar::feature_grammar(mapnik::transcoder const& attribute_value %= number | string_ ; + feature.name("Feature"); + properties.name("Properties"); + attributes.name("Attributes"); on_error ( feature , std::clog << phoenix::val("Error! Expecting ") - << _4 // what failed? + << _4 // what failed? << phoenix::val(" here: \"") - << construct(_3, _2) // iterators to error-pos, end + << where_message_(_3, _2, 16) // where? 16 is max chars to output << phoenix::val("\"") << std::endl ); diff --git a/src/json/geojson_generator.cpp b/src/json/geojson_generator.cpp index d178fe8d3..f35ba7265 100644 --- a/src/json/geojson_generator.cpp +++ b/src/json/geojson_generator.cpp @@ -62,7 +62,7 @@ bool geometry_generator::generate(std::string & geojson, mapnik::geometry_contai #include #include -#include +#include namespace mapnik { namespace json { diff --git a/src/json/geometry_grammar.cpp b/src/json/geometry_grammar.cpp index e965c3a53..797ef79f2 100644 --- a/src/json/geometry_grammar.cpp +++ b/src/json/geometry_grammar.cpp @@ -28,6 +28,11 @@ // boost #include +#include +#include +#include +#include // for clog, endl, etc +#include // for string namespace mapnik { namespace json { @@ -52,9 +57,9 @@ geometry_grammar::geometry_grammar() using qi::_pass; using qi::fail; using qi::on_error; - using phoenix::new_; - using phoenix::push_back; - using phoenix::construct; + using boost::phoenix::new_; + using boost::phoenix::push_back; + using boost::phoenix::construct; // Nabialek trick - FIXME: how to bind argument to dispatch rule? // geometry = lit("\"geometry\"") // >> lit(':') >> lit('{') @@ -139,16 +144,21 @@ geometry_grammar::geometry_grammar() // points points = lit('[')[_a = SEG_MOVETO] > -(point (_a,_r1) % lit(',')[_a = SEG_LINETO]) > lit(']'); + // give some rules names + geometry.name("Geometry"); + geometry_collection.name("GeometryCollection"); + geometry_dispatch.name("Geometry dispatch"); + coordinates.name("Coordinates"); // error handler on_error ( geometry , std::clog - << phoenix::val("Error! Expecting ") - << _4 // what failed? - << phoenix::val(" here: \"") - << construct(_3, _2) // iterators to error-pos, end - << phoenix::val("\"") + << boost::phoenix::val("Error! Expecting ") + << _4 // what failed? + << boost::phoenix::val(" here: \"") + << where_message_(_3, _2, 16) // max 16 chars + << boost::phoenix::val("\"") << std::endl ); } diff --git a/src/json/geometry_parser.cpp b/src/json/geometry_parser.cpp index 53c48ff73..f88177765 100644 --- a/src/json/geometry_parser.cpp +++ b/src/json/geometry_parser.cpp @@ -30,6 +30,9 @@ #include #include +// stl +#include + namespace mapnik { namespace json { #if BOOST_VERSION >= 104700 diff --git a/src/layer.cpp b/src/layer.cpp index fe8e6dab2..742affd76 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -239,7 +239,7 @@ bool layer::cache_features() const return cache_features_; } -void layer::set_group_by(std::string column) +void layer::set_group_by(std::string const& column) { group_by_ = column; } diff --git a/src/libxml2_loader.cpp b/src/libxml2_loader.cpp index e4af0c66c..6edc8822c 100644 --- a/src/libxml2_loader.cpp +++ b/src/libxml2_loader.cpp @@ -28,9 +28,7 @@ #include #include #include - -// boost -#include +#include // libxml #include @@ -38,6 +36,9 @@ #include #include +// stl +#include + #define DEFAULT_OPTIONS (XML_PARSE_NOERROR | XML_PARSE_NOENT | XML_PARSE_NOBLANKS | XML_PARSE_DTDLOAD | XML_PARSE_NOCDATA) namespace mapnik @@ -69,8 +70,7 @@ public: void load(std::string const& filename, xml_node &node) { - boost::filesystem::path path(filename); - if (!boost::filesystem::exists(path)) + if (!mapnik::util::exists(filename)) { throw config_error(std::string("Could not load map file: File does not exist"), 0, filename); } @@ -102,8 +102,7 @@ public: { if (!base_path.empty()) { - boost::filesystem::path path(base_path); - if (!boost::filesystem::exists(path)) { + if (!mapnik::util::exists(base_path)) { throw config_error(std::string("Could not locate base_path '") + base_path + "': file or directory does not exist"); } diff --git a/src/load_map.cpp b/src/load_map.cpp index 053eea13e..c7643e1ef 100644 --- a/src/load_map.cpp +++ b/src/load_map.cpp @@ -51,6 +51,8 @@ #include #include #include +#include +#include // boost #include @@ -59,7 +61,6 @@ #include #include #include -#include // agg #include "agg_trans_affine.h" @@ -76,7 +77,8 @@ public: strict_(strict), filename_(filename), relative_to_xml_(true), - font_manager_(font_engine_) + font_manager_(font_engine_), + xml_base_path_() {} void parse_map(Map & map, xml_node const& sty, std::string const& base_path); @@ -111,7 +113,7 @@ private: void find_unused_nodes_recursive(xml_node const& node, std::string & error_text); - std::string ensure_relative_to_xml(boost::optional opt_path); + std::string ensure_relative_to_xml(boost::optional const& opt_path); void ensure_exists(std::string const& file_path); boost::optional get_opt_color_attr(boost::property_tree::ptree const& node, std::string const& name); @@ -124,17 +126,18 @@ private: face_manager font_manager_; std::map file_sources_; std::map fontsets_; + std::string xml_base_path_; }; //#include -void load_map(Map & map, std::string const& filename, bool strict) +void load_map(Map & map, std::string const& filename, bool strict, std::string base_path) { // TODO - use xml encoding? xml_tree tree("utf8"); tree.set_filename(filename); read_xml(filename, tree.root()); map_parser parser(strict, filename); - parser.parse_map(map, tree.root(), ""); + parser.parse_map(map, tree.root(), base_path); //dump_xml(tree.root()); } @@ -143,9 +146,13 @@ void load_map_string(Map & map, std::string const& str, bool strict, std::string // TODO - use xml encoding? xml_tree tree("utf8"); if (!base_path.empty()) + { read_xml_string(str, tree.root(), base_path); // accept base_path passed into function + } else - read_xml_string(str, tree.root(), map.base_path()); // default to map base_path + { + read_xml_string(str, tree.root(), map.base_path()); // FIXME - this value is not fully known yet + } map_parser parser(strict, base_path); parser.parse_map(map, tree.root(), base_path); } @@ -174,18 +181,11 @@ void map_parser::parse_map(Map & map, xml_node const& pt, std::string const& bas { map.set_base_path(*base_path_from_xml); } - else + else if (!filename_.empty()) { - boost::filesystem::path xml_path(filename_); - // TODO - should we make this absolute? -#if (BOOST_FILESYSTEM_VERSION == 3) - std::string base = xml_path.parent_path().string(); -#else // v2 - std::string base = xml_path.branch_path().string(); -#endif - - map.set_base_path(base); + map.set_base_path(mapnik::util::dirname(filename_)); } + xml_base_path_ = map.base_path(); optional bgcolor = map_node.get_opt_attr("background-color"); if (bgcolor) @@ -199,7 +199,17 @@ void map_parser::parse_map(Map & map, xml_node const& pt, std::string const& bas map.set_background_image(ensure_relative_to_xml(image_filename)); } - map.set_srs(map_node.get_attr("srs", map.srs())); + std::string srs = map_node.get_attr("srs", map.srs()); + try + { + // create throwaway projection object here to ensure it is valid + projection proj(srs); + } + catch (proj_init_error const& ex) + { + throw mapnik::config_error(ex.what()); + } + map.set_srs(srs); optional buffer_size = map_node.get_opt_attr("buffer-size"); if (buffer_size) @@ -259,8 +269,6 @@ void map_parser::parse_map(Map & map, xml_node const& pt, std::string const& bas { throw config_error(std::string("Invalid version string encountered: '") + *beg + "' in '" + *min_version_string + "'"); - - break; } if (i==2) { @@ -281,7 +289,7 @@ void map_parser::parse_map(Map & map, xml_node const& pt, std::string const& bas } } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(map_node); throw; @@ -382,7 +390,7 @@ void map_parser::parse_map_include(Map & map, xml_node const& include) } } } - } catch (const config_error & ex) { + } catch (config_error const& ex) { ex.append_context(include); throw; } @@ -425,15 +433,10 @@ void map_parser::parse_style(Map & map, xml_node const& sty) if (filters) { std::string filter_str = *filters; - std::string::const_iterator itr = filter_str.begin(); - std::string::const_iterator end = filter_str.end(); - bool result = boost::spirit::qi::phrase_parse(itr,end, - sty.get_tree().image_filters_grammar, - boost::spirit::qi::ascii::space, - style.image_filters()); - if (!result || itr!=end) + bool result = filter::parse_image_filters(filter_str, style.image_filters()); + if (!result) { - throw config_error("failed to parse image-filters: '" + std::string(itr,end) + "'"); + throw config_error("failed to parse image-filters: '" + filter_str + "'"); } } @@ -470,7 +473,7 @@ void map_parser::parse_style(Map & map, xml_node const& sty) } map.insert_style(name, style); - } catch (const config_error & ex) { + } catch (config_error const& ex) { ex.append_context(std::string("in style '") + name + "'", sty); throw; } @@ -510,7 +513,7 @@ void map_parser::parse_fontset(Map & map, xml_node const& fset) // when it's parsed fontsets_.insert(std::pair(name, fontset)); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(std::string("in FontSet '") + name + "'", fset); throw; @@ -548,9 +551,17 @@ void map_parser::parse_layer(Map & map, xml_node const& node) { name = node.get_attr("name", std::string("Unnamed")); - // XXX if no projection is given inherit from map? [DS] + // If no projection is given inherit from map std::string srs = node.get_attr("srs", map.srs()); - + try + { + // create throwaway projection object here to ensure it is valid + projection proj(srs); + } + catch (proj_init_error const& ex) + { + throw mapnik::config_error(ex.what()); + } layer lyr(name, srs); optional status = node.get_opt_attr("status"); @@ -715,7 +726,7 @@ void map_parser::parse_layer(Map & map, xml_node const& node) } map.addLayer(lyr); } - catch (const config_error & ex) + catch (config_error const& ex) { if (!name.empty()) { @@ -815,7 +826,7 @@ void map_parser::parse_rule(feature_type_style & style, xml_node const& r) style.add_rule(rule); } - catch (const config_error & ex) + catch (config_error const& ex) { if (!name.empty()) { @@ -938,7 +949,7 @@ void map_parser::parse_point_symbolizer(rule & rule, xml_node const & sym) parse_symbolizer_base(symbol, sym); rule.append(symbol); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1084,7 +1095,7 @@ void map_parser::parse_line_pattern_symbolizer(rule & rule, xml_node const & sym parse_symbolizer_base(symbol, sym); rule.append(symbol); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1137,7 +1148,7 @@ void map_parser::parse_polygon_pattern_symbolizer(rule & rule, parse_symbolizer_base(symbol, sym); rule.append(symbol); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1164,9 +1175,12 @@ void map_parser::parse_text_symbolizer(rule & rule, xml_node const& sym) text_symbolizer text_symbol = text_symbolizer(placement_finder); parse_symbolizer_base(text_symbol, sym); + optional halo_rasterizer = sym.get_opt_attr("halo-rasterizer"); + if (halo_rasterizer) text_symbol.set_halo_rasterizer(*halo_rasterizer); + rule.append(text_symbol); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1267,7 +1281,7 @@ void map_parser::parse_shield_symbolizer(rule & rule, xml_node const& sym) parse_symbolizer_base(shield_symbol, sym); rule.append(shield_symbol); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1376,7 +1390,7 @@ void map_parser::parse_line_symbolizer(rule & rule, xml_node const & sym) parse_symbolizer_base(symbol, sym); rule.append(symbol); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1405,7 +1419,7 @@ void map_parser::parse_polygon_symbolizer(rule & rule, xml_node const & sym) parse_symbolizer_base(poly_sym, sym); rule.append(poly_sym); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1431,7 +1445,7 @@ void map_parser::parse_building_symbolizer(rule & rule, xml_node const & sym) parse_symbolizer_base(building_sym, sym); rule.append(building_sym); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1523,7 +1537,7 @@ void map_parser::parse_raster_symbolizer(rule & rule, xml_node const & sym) parse_symbolizer_base(raster_sym, sym); rule.append(raster_sym); } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(sym); throw; @@ -1533,8 +1547,10 @@ void map_parser::parse_raster_symbolizer(rule & rule, xml_node const & sym) void map_parser::parse_debug_symbolizer(rule & rule, xml_node const & sym) { debug_symbolizer symbol; - parse_symbolizer_base(symbol, sym); + debug_symbolizer_mode_e mode = + sym.get_attr("mode", DEBUG_SYM_MODE_COLLISION); + symbol.set_mode(mode); rule.append(symbol); } @@ -1619,7 +1635,7 @@ bool map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc, } } } - catch (const config_error & ex) + catch (config_error const& ex) { ex.append_context(node); throw; @@ -1636,29 +1652,17 @@ void map_parser::ensure_font_face(std::string const& face_name) } } -std::string map_parser::ensure_relative_to_xml(boost::optional opt_path) +std::string map_parser::ensure_relative_to_xml(boost::optional const& opt_path) { if (marker_cache::instance().is_uri(*opt_path)) return *opt_path; - if (relative_to_xml_) + if (!xml_base_path_.empty() && relative_to_xml_) { - boost::filesystem::path xml_path = filename_; - boost::filesystem::path rel_path = *opt_path; - if (!rel_path.has_root_path()) + std::string starting_path = *opt_path; + if (mapnik::util::is_relative(starting_path)) { -#if (BOOST_FILESYSTEM_VERSION == 3) - // TODO - normalize is now deprecated, use make_preferred? - boost::filesystem::path full = boost::filesystem::absolute(xml_path.parent_path()/rel_path); -#else // v2 - boost::filesystem::path full = boost::filesystem::complete(xml_path.branch_path()/rel_path).normalize(); -#endif - - MAPNIK_LOG_DEBUG(load_map) << "map_parser: Modifying relative paths to be relative to xml..."; - MAPNIK_LOG_DEBUG(load_map) << "map_parser: -- Original base path=" << *opt_path; - MAPNIK_LOG_DEBUG(load_map) << "map_parser: -- Relative base path=" << full.string(); - - return full.string(); + return mapnik::util::make_absolute(starting_path,xml_base_path_); } } return *opt_path; @@ -1671,7 +1675,7 @@ void map_parser::ensure_exists(std::string const& file_path) // 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 (!boost::filesystem::exists(file_path)) + if (!mapnik::util::exists(file_path)) { throw mapnik::config_error("file could not be found: '" + file_path + "'"); } diff --git a/src/map.cpp b/src/map.cpp index 75a87209c..1d0ff42a4 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -42,6 +42,9 @@ // boost #include +// stl +#include + namespace mapnik { @@ -75,7 +78,7 @@ Map::Map(int width,int height, std::string const& srs) aspectFixMode_(GROW_BBOX), base_path_("") {} -Map::Map(const Map& rhs) +Map::Map(Map const& rhs) : width_(rhs.width_), height_(rhs.height_), srs_(rhs.srs_), @@ -93,7 +96,7 @@ Map::Map(const Map& rhs) Map::~Map() {} -Map& Map::operator=(const Map& rhs) +Map& Map::operator=(Map const& rhs) { if (this==&rhs) return *this; width_=rhs.width_; @@ -132,12 +135,12 @@ Map::style_iterator Map::end_styles() return styles_.end(); } -Map::const_style_iterator Map::begin_styles() const +Map::const_style_iterator Map::begin_styles() const { return styles_.begin(); } -Map::const_style_iterator Map::end_styles() const +Map::const_style_iterator Map::end_styles() const { return styles_.end(); } @@ -194,7 +197,7 @@ size_t Map::layer_count() const return layers_.size(); } -void Map::addLayer(const layer& l) +void Map::addLayer(layer const& l) { layers_.push_back(l); } @@ -210,7 +213,7 @@ void Map::remove_all() styles_.clear(); } -const layer& Map::getLayer(size_t index) const +layer const& Map::getLayer(size_t index) const { return layers_[index]; } @@ -264,8 +267,8 @@ void Map::set_height(unsigned height) void Map::resize(unsigned width,unsigned height) { - if (width != width_ && - height != height_ && + if ((width != width_ || + height != height_) && width >= MIN_MAPSIZE && width <= MAX_MAPSIZE && height >= MIN_MAPSIZE && @@ -302,7 +305,7 @@ boost::optional const& Map::background() const return background_; } -void Map::set_background(const color& c) +void Map::set_background(color const& c) { background_ = c; } @@ -424,13 +427,13 @@ void Map::zoom_all() } } } - catch (proj_init_error & ex) + catch (proj_init_error const& ex) { throw mapnik::config_error(std::string("Projection error during map.zoom_all: ") + ex.what()); } } -void Map::zoom_to_box(const box2d &box) +void Map::zoom_to_box(box2d const& box) { current_extent_=box; fixAspectRatio(); @@ -492,7 +495,7 @@ void Map::fixAspectRatio() } } -const box2d& Map::get_current_extent() const +box2d const& Map::get_current_extent() const { return current_extent_; } diff --git a/src/mapped_memory_cache.cpp b/src/mapped_memory_cache.cpp index a9f385e52..eb109a1f3 100644 --- a/src/mapped_memory_cache.cpp +++ b/src/mapped_memory_cache.cpp @@ -22,12 +22,12 @@ // mapnik #include +#include #include // boost #include #include -#include #include namespace mapnik @@ -63,8 +63,7 @@ boost::optional mapped_memory_cache::find(std::string const& return result; } - boost::filesystem::path path(uri); - if (exists(path)) + if (mapnik::util::exists(uri)) { try { @@ -79,9 +78,11 @@ boost::optional mapped_memory_cache::find(std::string const& } return result; } - catch (...) + catch (std::exception const& ex) { - MAPNIK_LOG_ERROR(mapped_memory_cache) << "Exception caught while loading mapping memory file: " << uri; + MAPNIK_LOG_ERROR(mapped_memory_cache) + << "Error loading mapped memory file: '" + << uri << "' (" << ex.what() << ")"; } } /* diff --git a/src/marker_cache.cpp b/src/marker_cache.cpp index 526fffb6c..d550457c6 100644 --- a/src/marker_cache.cpp +++ b/src/marker_cache.cpp @@ -31,10 +31,10 @@ #include #include #include +#include // boost #include -#include #include #include @@ -151,6 +151,7 @@ boost::optional marker_cache::find(std::string const& uri, double lox,loy,hix,hiy; 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(boost::make_shared(marker_path)); result.reset(mark); if (update_cache) @@ -161,8 +162,7 @@ boost::optional marker_cache::find(std::string const& uri, // otherwise assume file-based else { - boost::filesystem::path path(uri); - if (!exists(path)) + if (!mapnik::util::exists(uri)) { MAPNIK_LOG_ERROR(marker_cache) << "Marker does not exist: " << uri; return result; @@ -180,6 +180,7 @@ boost::optional marker_cache::find(std::string const& uri, double lox,loy,hix,hiy; 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(boost::make_shared(marker_path)); result.reset(mark); if (update_cache) @@ -222,10 +223,6 @@ boost::optional marker_cache::find(std::string const& uri, { MAPNIK_LOG_ERROR(marker_cache) << "Exception caught while loading: '" << uri << "' (" << ex.what() << ")"; } - catch (...) - { - MAPNIK_LOG_ERROR(marker_cache) << "Exception caught while loading: '" << uri << "'"; - } return result; } diff --git a/src/markers_symbolizer.cpp b/src/markers_symbolizer.cpp index 0bb371cb1..6c48effd2 100644 --- a/src/markers_symbolizer.cpp +++ b/src/markers_symbolizer.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace mapnik { diff --git a/src/memory_datasource.cpp b/src/memory_datasource.cpp index 71a0a2063..8dcd1161d 100644 --- a/src/memory_datasource.cpp +++ b/src/memory_datasource.cpp @@ -90,9 +90,8 @@ featureset_ptr memory_datasource::features(const query& q) const featureset_ptr memory_datasource::features_at_point(coord2d const& pt, double tol) const { box2d box = box2d(pt.x, pt.y, pt.x, pt.y); - + box.pad(tol); MAPNIK_LOG_DEBUG(memory_datasource) << "memory_datasource: Box=" << box << ", Point x=" << pt.x << ",y=" << pt.y; - return boost::make_shared(box,*this); } diff --git a/src/miniz_png.cpp b/src/miniz_png.cpp index ec445d0ba..78776c53e 100644 --- a/src/miniz_png.cpp +++ b/src/miniz_png.cpp @@ -28,7 +28,6 @@ // miniz #define MINIZ_NO_ARCHIVE_APIS -#define MINIZ_NO_STDIO #define MINIZ_NO_ZLIB_COMPATIBLE_NAMES #include "miniz.c" diff --git a/src/parse_path.cpp b/src/parse_path.cpp index ba42624a0..90265b9ab 100644 --- a/src/parse_path.cpp +++ b/src/parse_path.cpp @@ -27,13 +27,16 @@ #include #include #include -#include // boost #include #include #include +// stl +#include + + namespace mapnik { path_expression_ptr parse_path(std::string const& str) diff --git a/src/placement_finder.cpp b/src/placement_finder.cpp index 97fc496db..63db19727 100644 --- a/src/placement_finder.cpp +++ b/src/placement_finder.cpp @@ -34,7 +34,6 @@ // boost #include -#include #include #include #include @@ -98,8 +97,7 @@ double get_total_distance(T & shape_path) } template -placement_finder::placement_finder(feature_impl const& feature, - text_placement_info const& placement_info, +placement_finder::placement_finder(text_placement_info const& placement_info, string_info const& info, DetectorT & detector, box2d const& extent) @@ -919,7 +917,7 @@ bool placement_finder::test_placement(std::auto_ptr const& double cwidth = ci.width + ci.format->character_spacing; char_info_ptr c; double x, y, angle; - current_placement->vertex(&c, &x, &y, &angle); + current_placement->vertex(c, x, y, angle); x = current_placement->center.x + x; y = current_placement->center.y - y; diff --git a/src/plugin.cpp b/src/plugin.cpp index 47c0d5f2e..ca8b09567 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -21,30 +21,86 @@ *****************************************************************************/ #include -#include +#include + +#ifdef _WINDOWS + #include + #define handle HMODULE + #define dlsym GetProcAddress + #define dlclose FreeLibrary + #define dlerror GetLastError +#else + #include + #define handle void * +#endif + +// TODO - handle/report dlerror namespace mapnik { -PluginInfo::PluginInfo (std::string const& name,const lt_dlhandle module) - :name_(name),module_(module) {} +struct _mapnik_lib_t { + handle dl; +}; + +PluginInfo::PluginInfo(std::string const& filename, + std::string const& library_name) + : filename_(filename), + name_(), + module_(new mapnik_lib_t) + { +#ifdef _WINDOWS + if (module_) module_->dl = LoadLibraryA(filename.c_str()); +#else + if (module_) module_->dl = dlopen(filename.c_str(),RTLD_LAZY); +#endif + if (module_ && module_->dl) + { + name_func* name = reinterpret_cast(dlsym(module_->dl, library_name.c_str())); + if (name) name_ = name(); + } + } PluginInfo::~PluginInfo() { if (module_) { - lt_dlclose(module_),module_=0; + if (module_->dl) dlclose(module_->dl),module_->dl=0; + delete module_; } } + +void * PluginInfo::get_symbol(std::string const& sym_name) const +{ + return static_cast(dlsym(module_->dl, sym_name.c_str())); +} + std::string const& PluginInfo::name() const { return name_; } -lt_dlhandle PluginInfo::handle() const +bool PluginInfo::valid() const { - return module_; + if (module_ && module_->dl && !name_.empty()) return true; + return false; } +std::string PluginInfo::get_error() const +{ + return std::string("could not open: '") + name_ + "'"; +} + +void PluginInfo::init() +{ + // do any initialization needed +} + +void PluginInfo::exit() +{ + // do any shutdown needed +} + + } diff --git a/src/png_reader.cpp b/src/png_reader.cpp index 1e542ce0b..100ce2ea6 100644 --- a/src/png_reader.cpp +++ b/src/png_reader.cpp @@ -20,29 +20,54 @@ * *****************************************************************************/ +// mapnik #include #include -#include extern "C" { #include } - +// boost #include +#include +#include +#include namespace mapnik { -class png_reader : public image_reader, mapnik::noncopyable + +template +class png_reader : public image_reader { + typedef T source_type; + typedef boost::iostreams::stream ifstream; + + struct png_struct_guard + { + png_struct_guard(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) + : p_(png_ptr_ptr), + i_(info_ptr_ptr) {} + + ~png_struct_guard() + { + png_destroy_read_struct(p_,i_,0); + } + png_structpp p_; + png_infopp i_; + }; + private: - std::string fileName_; + + source_type source_; + ifstream stream_; unsigned width_; unsigned height_; int bit_depth_; int color_type_; public: - explicit png_reader(std::string const& fileName); + explicit png_reader(std::string const& file_name); + explicit png_reader(char const* data, std::size_t size); ~png_reader(); unsigned width() const; unsigned height() const; @@ -50,75 +75,101 @@ public: void read(unsigned x,unsigned y,image_data_32& image); private: void init(); + static void png_read_data(png_structp png_ptr, png_bytep data, png_size_t length); }; namespace { + image_reader* create_png_reader(std::string const& file) { - return new png_reader(file); + return new png_reader(file); } + +image_reader* create_png_reader2(char const * data, std::size_t size) +{ + return new png_reader(data, size); +} + const bool registered = register_image_reader("png",create_png_reader); +const bool registered2 = register_image_reader("png", create_png_reader2); } -png_reader::png_reader(std::string const& fileName) - : fileName_(fileName), - width_(0), - height_(0), - bit_depth_(0), - color_type_(0) + +void user_error_fn(png_structp /*png_ptr*/, png_const_charp error_msg) { - init(); + throw image_reader_exception(std::string("failed to read invalid png: '") + error_msg + "'"); } -png_reader::~png_reader() {} - -void user_error_fn(png_structp png_ptr, png_const_charp error_msg) -{ - throw image_reader_exception("failed to read invalid png"); -} - -void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg) +void user_warning_fn(png_structp /*png_ptr*/, png_const_charp warning_msg) { MAPNIK_LOG_DEBUG(png_reader) << "libpng warning: '" << warning_msg << "'"; } -static void -png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +template +void png_reader::png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { - png_size_t check; - check = (png_size_t)fread(data, (png_size_t)1, length, - (FILE *)png_get_io_ptr(png_ptr)); - - if (check != length) + ifstream * fin = reinterpret_cast(png_get_io_ptr(png_ptr)); + fin->read(reinterpret_cast(data), length); + if (fin->gcount() != static_cast(length)) { png_error(png_ptr, "Read Error"); } } -void png_reader::init() +template +png_reader::png_reader(std::string const& file_name) + : source_(file_name,std::ios_base::in | std::ios_base::binary), + stream_(source_), + width_(0), + height_(0), + bit_depth_(0), + color_type_(0) +{ + + if (!stream_) throw image_reader_exception("cannot open image file "+ file_name); + init(); +} + +template +png_reader::png_reader(char const* data, std::size_t size) + : source_(data,size), + stream_(source_), + width_(0), + height_(0), + bit_depth_(0), + color_type_(0) +{ + + if (!stream_) throw image_reader_exception("cannot open image stream"); + init(); +} + + +template +png_reader::~png_reader() {} + + +template +void png_reader::init() { - FILE *fp=fopen(fileName_.c_str(),"rb"); - if (!fp) throw image_reader_exception("cannot open image file "+fileName_); png_byte header[8]; memset(header,0,8); - if ( fread(header,1,8,fp) != 8) + stream_.read(reinterpret_cast(header),8); + if ( stream_.gcount() != 8) { - fclose(fp); - throw image_reader_exception("Could not read " + fileName_); + throw image_reader_exception("Could not read image"); } int is_png=!png_sig_cmp(header,0,8); if (!is_png) { - fclose(fp); - throw image_reader_exception(fileName_ + " is not a png file"); + throw image_reader_exception("File or stream is not a png"); } png_structp png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,0,0,0); if (!png_ptr) { - fclose(fp); throw image_reader_exception("failed to allocate png_ptr"); } @@ -126,24 +177,11 @@ void png_reader::init() png_set_error_fn(png_ptr, png_get_error_ptr(png_ptr), user_error_fn, user_warning_fn); png_infop info_ptr; - try - { - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { - png_destroy_read_struct(&png_ptr,0,0); - fclose(fp); - throw image_reader_exception("failed to create info_ptr"); - } - } - catch (std::exception const& ex) - { - png_destroy_read_struct(&png_ptr,0,0); - fclose(fp); - throw; - } + png_struct_guard sguard(&png_ptr,&info_ptr); + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) throw image_reader_exception("failed to create info_ptr"); - png_set_read_fn(png_ptr, (png_voidp)fp, png_read_data); + png_set_read_fn(png_ptr, (png_voidp)&stream_, png_read_data); png_set_sig_bytes(png_ptr,8); png_read_info(png_ptr, info_ptr); @@ -155,32 +193,31 @@ void png_reader::init() height_=height; MAPNIK_LOG_DEBUG(png_reader) << "png_reader: bit_depth=" << bit_depth_ << ",color_type=" << color_type_; - - png_destroy_read_struct(&png_ptr,&info_ptr,0); - fclose(fp); } -unsigned png_reader::width() const +template +unsigned png_reader::width() const { return width_; } -unsigned png_reader::height() const +template +unsigned png_reader::height() const { return height_; } -void png_reader::read(unsigned x0, unsigned y0,image_data_32& image) +template +void png_reader::read(unsigned x0, unsigned y0,image_data_32& image) { - FILE *fp=fopen(fileName_.c_str(),"rb"); - if (!fp) throw image_reader_exception("cannot open image file "+fileName_); + stream_.clear(); + stream_.seekg(0, std::ios_base::beg); png_structp png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,0,0,0); if (!png_ptr) { - fclose(fp); throw image_reader_exception("failed to allocate png_ptr"); } @@ -188,24 +225,11 @@ void png_reader::read(unsigned x0, unsigned y0,image_data_32& image) png_set_error_fn(png_ptr, png_get_error_ptr(png_ptr), user_error_fn, user_warning_fn); png_infop info_ptr; - try - { - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { - png_destroy_read_struct(&png_ptr,0,0); - fclose(fp); - throw image_reader_exception("failed to create info_ptr"); - } - } - catch (std::exception const& ex) - { - png_destroy_read_struct(&png_ptr,0,0); - fclose(fp); - throw; - } + png_struct_guard sguard(&png_ptr,&info_ptr); + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) throw image_reader_exception("failed to create info_ptr"); - png_set_read_fn(png_ptr, (png_voidp)fp, png_read_data); + png_set_read_fn(png_ptr, (png_voidp)&stream_, png_read_data); png_read_info(png_ptr, info_ptr); if (color_type_ == PNG_COLOR_TYPE_PALETTE) @@ -248,24 +272,21 @@ void png_reader::read(unsigned x0, unsigned y0,image_data_32& image) else { png_read_update_info(png_ptr, info_ptr); - unsigned w=std::min(unsigned(image.width()),width_); - unsigned h=std::min(unsigned(image.height()),height_); + unsigned w=std::min(unsigned(image.width()),width_ - x0); + unsigned h=std::min(unsigned(image.height()),height_ - y0); unsigned rowbytes=png_get_rowbytes(png_ptr, info_ptr); boost::scoped_array row(new png_byte[rowbytes]); //START read image rows - for (unsigned i=0;i=y0 && i= y0 && i < (y0 + h)) { - image.setRow(i-y0,reinterpret_cast(&row[x0]),w); + image.setRow(i-y0,reinterpret_cast(&row[x0 * 4]),w); } } //END } - png_read_end(png_ptr,0); - png_destroy_read_struct(&png_ptr, &info_ptr,0); - fclose(fp); } } diff --git a/src/polygon_pattern_symbolizer.cpp b/src/polygon_pattern_symbolizer.cpp index 4a2e60c31..67449890e 100644 --- a/src/polygon_pattern_symbolizer.cpp +++ b/src/polygon_pattern_symbolizer.cpp @@ -22,6 +22,7 @@ // mapnik #include +#include namespace mapnik { diff --git a/src/processed_text.cpp b/src/processed_text.cpp index 83db904c1..4d2064d7e 100644 --- a/src/processed_text.cpp +++ b/src/processed_text.cpp @@ -55,7 +55,7 @@ void processed_text::clear() } -string_info &processed_text::get_string_info() +string_info const& processed_text::get_string_info() { info_.clear(); //if this function is called twice invalid results are returned, so clear string_info first expression_list::iterator itr = expr_list_.begin(); diff --git a/src/proj_transform.cpp b/src/proj_transform.cpp index 9972ca4ae..688296496 100644 --- a/src/proj_transform.cpp +++ b/src/proj_transform.cpp @@ -33,6 +33,7 @@ // stl #include +#include namespace mapnik { diff --git a/src/projection.cpp b/src/projection.cpp index abe871c9c..871e357a0 100644 --- a/src/projection.cpp +++ b/src/projection.cpp @@ -26,12 +26,19 @@ #include #include +// stl +#include + #ifdef MAPNIK_USE_PROJ4 // proj4 #include #if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 #include +#ifdef _MSC_VER +#pragma NOTE(mapnik is building against < proj 4.8, reprojection will be faster if you use >= 4.8) +#else #warning mapnik is building against < proj 4.8, reprojection will be faster if you use >= 4.8 +#endif static boost::mutex mutex_; #endif @@ -68,13 +75,16 @@ projection::projection(projection const& rhs) proj_(NULL), proj_ctx_(NULL) { - if (!rhs.defer_proj_init_) init_proj4(); + if (!defer_proj_init_) init_proj4(); } projection& projection::operator=(projection const& rhs) { projection tmp(rhs); swap(tmp); + proj_ctx_ = 0; + proj_ = 0; + if (!defer_proj_init_) init_proj4(); return *this; } @@ -210,6 +220,8 @@ std::string projection::expanded() const void projection::swap(projection& rhs) { std::swap(params_,rhs.params_); + std::swap(defer_proj_init_,rhs.defer_proj_init_); + std::swap(is_geographic_,rhs.is_geographic_); } } diff --git a/src/rapidxml_loader.cpp b/src/rapidxml_loader.cpp index a983b7c22..557ae0950 100644 --- a/src/rapidxml_loader.cpp +++ b/src/rapidxml_loader.cpp @@ -79,8 +79,9 @@ public: try { // Parse using appropriate flags - const int f_tws = rapidxml::parse_normalize_whitespace - | rapidxml::parse_trim_whitespace; + // https://github.com/mapnik/mapnik/issues/1856 + // const int f_tws = rapidxml::parse_normalize_whitespace; + const int f_tws = rapidxml::parse_trim_whitespace; rapidxml::xml_document<> doc; doc.parse(&v.front()); @@ -90,7 +91,7 @@ public: populate_tree(child, node); } } - catch (rapidxml::parse_error &e) + catch (rapidxml::parse_error const& e) { long line = static_cast( std::count(&v.front(), e.where(), '\n') + 1); @@ -103,15 +104,16 @@ public: // if (!base_path.empty()) // { -// boost::filesystem::path path(base_path); -// if (!boost::filesystem::exists(path)) { +// if (!mapnik::util::exists(base_path)) { // throw config_error(std::string("Could not locate base_path '") + // base_path + "': file or directory does not exist"); // } // } - - load(buffer, node); + // https://github.com/mapnik/mapnik/issues/1857 + std::stringstream s; + s << buffer; + load(s, node); } private: void populate_tree(rapidxml::xml_node *cur_node, xml_node &node) @@ -141,10 +143,7 @@ private: case rapidxml::node_data: case rapidxml::node_cdata: { - std::string trimmed(cur_node->value()); - mapnik::util::trim(trimmed); - if (trimmed.empty()) break; //Don't add empty text nodes - node.add_child(trimmed, 0, true); + node.add_child(cur_node->value(), 0, true); } break; default: diff --git a/src/raster_colorizer.cpp b/src/raster_colorizer.cpp index 25cacf679..fbacb1212 100644 --- a/src/raster_colorizer.cpp +++ b/src/raster_colorizer.cpp @@ -27,6 +27,7 @@ #include #include #include +#include // stl #include diff --git a/src/raster_symbolizer.cpp b/src/raster_symbolizer.cpp index cfdf4c632..a62a42c4e 100644 --- a/src/raster_symbolizer.cpp +++ b/src/raster_symbolizer.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include diff --git a/src/request.cpp b/src/request.cpp new file mode 100644 index 000000000..b99f533de --- /dev/null +++ b/src/request.cpp @@ -0,0 +1,85 @@ +/***************************************************************************** + * + * 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 + +namespace mapnik +{ + +request::request(unsigned width, + unsigned height, + box2d const& extent) + : width_(width), + height_(height), + extent_(extent), + buffer_size_(0) {} + +request::~request() {} + +unsigned request::width() const +{ + return width_; +} + +unsigned request::height() const +{ + return height_; +} + +void request::set_buffer_size(int buffer_size) +{ + buffer_size_ = buffer_size; +} + +int request::buffer_size() const +{ + return buffer_size_; +} + +void request::set_extent(box2d const& box) +{ + extent_ = box; +} + +box2d const& request::extent() const +{ + return extent_; +} + +box2d request::get_buffered_extent() const +{ + double extra = 2.0 * scale() * buffer_size_; + box2d ext(extent_); + ext.width(extent_.width() + extra); + ext.height(extent_.height() + extra); + return ext; +} + +double request::scale() const +{ + if (width_>0) + return extent_.width()/width_; + return extent_.width(); +} + +} diff --git a/src/save_map.cpp b/src/save_map.cpp index 4d3aee4f4..be74aa681 100644 --- a/src/save_map.cpp +++ b/src/save_map.cpp @@ -190,8 +190,7 @@ public: if (sym.get_colorizer()) { - serialize_raster_colorizer(sym_node, sym.get_colorizer(), - explicit_defaults_); + serialize_raster_colorizer(sym_node, sym.get_colorizer()); } boost::optional premultiplied = sym.premultiplied(); @@ -254,6 +253,11 @@ public: add_font_attributes( sym_node, sym); serialize_symbolizer_base(sym_node, sym); + text_symbolizer dfl; + if (sym.get_halo_rasterizer() != dfl.get_halo_rasterizer() || explicit_defaults_) + { + set_attr(sym_node, "halo-rasterizer", sym.get_halo_rasterizer()); + } } void operator () ( building_symbolizer const& sym ) @@ -347,13 +351,16 @@ public: } template +#ifdef MAPNIK_DEBUG void operator () ( Symbolizer const& sym) { - // not-supported -#ifdef MAPNIK_DEBUG MAPNIK_LOG_WARN(save_map) << typeid(sym).name() << " is not supported"; -#endif } +#else + void operator () ( Symbolizer const& /*sym*/) + { + } +#endif private: serialize_symbolizer(); @@ -389,16 +396,23 @@ private: } void serialize_raster_colorizer(ptree & sym_node, - raster_colorizer_ptr const& colorizer, - bool explicit_defaults) + raster_colorizer_ptr const& colorizer) { ptree & col_node = sym_node.push_back( ptree::value_type("RasterColorizer", ptree() ))->second; - - set_attr(col_node, "default-mode", colorizer->get_default_mode()); - set_attr(col_node, "default-color", colorizer->get_default_color()); - set_attr(col_node, "epsilon", colorizer->get_epsilon()); - + raster_colorizer dfl; + if (colorizer->get_default_mode() != dfl.get_default_mode() || explicit_defaults_) + { + set_attr(col_node, "default-mode", colorizer->get_default_mode()); + } + if (colorizer->get_default_color() != dfl.get_default_color() || explicit_defaults_) + { + set_attr(col_node, "default-color", colorizer->get_default_color()); + } + if (colorizer->get_epsilon() != dfl.get_epsilon() || explicit_defaults_) + { + set_attr(col_node, "epsilon", colorizer->get_epsilon()); + } unsigned i; colorizer_stops const &stops = colorizer->get_stops(); for (i=0; i.type", "int" ); } - void operator () ( mapnik::value_double val ) const + void operator () ( mapnik::value_double /*val*/ ) const { node_.put(".type", "float" ); } - void operator () ( std::string const& val ) const + void operator () ( std::string const& /*val*/ ) const { node_.put(".type", "string" ); } - void operator () ( mapnik::value_null val ) const + void operator () ( mapnik::value_null /*val*/ ) const { node_.put(".type", "string" ); } diff --git a/src/stroke.cpp b/src/stroke.cpp index acaf6c93b..deb4ce625 100644 --- a/src/stroke.cpp +++ b/src/stroke.cpp @@ -21,6 +21,7 @@ *****************************************************************************/ #include +#include namespace mapnik { diff --git a/src/svg/output/process_line_symbolizer.cpp b/src/svg/output/process_line_symbolizer.cpp index a93346326..6f2008408 100644 --- a/src/svg/output/process_line_symbolizer.cpp +++ b/src/svg/output/process_line_symbolizer.cpp @@ -30,8 +30,8 @@ namespace mapnik */ template void svg_renderer::process(line_symbolizer const& sym, - mapnik::feature_impl & feature, - proj_transform const& prj_trans) + mapnik::feature_impl & /*feature*/, + proj_transform const& /*prj_trans*/) { path_attributes_.set_stroke_color(sym.get_stroke().get_color()); path_attributes_.set_stroke_opacity(sym.get_stroke().get_opacity()); diff --git a/src/svg/output/process_symbolizers.cpp b/src/svg/output/process_symbolizers.cpp index c6db3ea62..e4065159f 100644 --- a/src/svg/output/process_symbolizers.cpp +++ b/src/svg/output/process_symbolizers.cpp @@ -25,6 +25,28 @@ namespace mapnik { +struct symbol_type_dispatch : public boost::static_visitor +{ + template + bool operator()(Symbolizer const& sym) const + { + return false; + } + bool operator()(line_symbolizer const& sym) const + { + return true; + } + bool operator()(polygon_symbolizer const& sym) const + { + return true; + } +}; + +bool is_path_based(symbolizer const& sym) +{ + return boost::apply_visitor(symbol_type_dispatch(), sym); +} + template bool svg_renderer::process(rule::symbolizers const& syms, mapnik::feature_impl & feature, @@ -33,29 +55,35 @@ bool svg_renderer::process(rule::symbolizers const& syms, // svg renderer supports processing of multiple symbolizers. typedef coord_transform path_type; + bool process_path = false; // process each symbolizer to collect its (path) information. // path information (attributes from line_ and polygon_ symbolizers) // is collected with the path_attributes_ data member. BOOST_FOREACH(symbolizer const& sym, syms) { + if (is_path_based(sym)) + { + process_path = true; + } boost::apply_visitor(symbol_dispatch(*this, feature, prj_trans), sym); } - // generate path output for each geometry of the current feature. - for(unsigned i=0; i 0) + // generate path output for each geometry of the current feature. + for(unsigned i=0; i 0) + { + path_type path(t_, geom, prj_trans); + generator_.generate_path(path, path_attributes_); + } } + // set the previously collected values back to their defaults + // for the feature that will be processed next. + path_attributes_.reset(); } - - // set the previously collected values back to their defaults - // for the feature that will be processed next. - path_attributes_.reset(); - return true; } diff --git a/src/svg/output/svg_generator.cpp b/src/svg/output/svg_generator.cpp index f5d955e07..e5e2f7a84 100644 --- a/src/svg/output/svg_generator.cpp +++ b/src/svg/output/svg_generator.cpp @@ -23,6 +23,7 @@ // mapnik #include #include +#include // boost #include @@ -65,5 +66,39 @@ namespace mapnik { namespace svg { karma::generate(output_iterator_, lit("\n"), rect_attributes); } + template + void svg_generator::generate_opening_group(mapnik::value_integer val) + { + std::string string_val; + mapnik::util::to_string(string_val,val); + karma::generate(output_iterator_, lit(" + void svg_generator::generate_opening_group(std::string const& val) + { + karma::generate(output_iterator_, lit("\n")); + } + + template + void svg_generator::generate_closing_group() + { + karma::generate(output_iterator_, lit("\n")); + } + template class svg_generator >; }} diff --git a/src/svg/output/svg_renderer.cpp b/src/svg/output/svg_renderer.cpp index f940b6252..49ce2b4db 100644 --- a/src/svg/output/svg_renderer.cpp +++ b/src/svg/output/svg_renderer.cpp @@ -24,20 +24,46 @@ #include #include #include +#include +#include +#include // stl #include namespace mapnik { + template -svg_renderer::svg_renderer(Map const& m, T & output_iterator, unsigned offset_x, unsigned offset_y) : - feature_style_processor(m), +svg_renderer::svg_renderer(Map const& m, T & output_iterator, double scale_factor, unsigned offset_x, unsigned offset_y) : + feature_style_processor(m, scale_factor), output_iterator_(output_iterator), width_(m.width()), height_(m.height()), + scale_factor_(scale_factor), t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y), - generator_(output_iterator) + font_engine_(), + font_manager_(font_engine_), + detector_(boost::make_shared(box2d(-m.buffer_size(), -m.buffer_size(), m.width() + m.buffer_size() ,m.height() + m.buffer_size()))), + generator_(output_iterator), + query_extent_(), + painted_(false) +{} + +template +svg_renderer::svg_renderer(Map const& m, request const& req, T & output_iterator, double scale_factor, unsigned offset_x, unsigned offset_y) : + feature_style_processor(m, scale_factor), + output_iterator_(output_iterator), + width_(req.width()), + height_(req.height()), + scale_factor_(scale_factor), + t_(req.width(),req.height(),req.extent(),offset_x,offset_y), + font_engine_(), + font_manager_(font_engine_), + detector_(boost::make_shared(box2d(-req.buffer_size(), -req.buffer_size(), req.width() + req.buffer_size() ,req.height() + req.buffer_size()))), + generator_(output_iterator), + query_extent_(), + painted_(false) {} template @@ -78,12 +104,14 @@ void svg_renderer::end_map_processing(Map const& map) template void svg_renderer::start_layer_processing(layer const& lay, box2d const& query_extent) { + generator_.generate_opening_group(lay.name()); MAPNIK_LOG_DEBUG(svg_renderer) << "svg_renderer: Start layer processing=" << lay.name(); } template void svg_renderer::end_layer_processing(layer const& lay) { + generator_.generate_closing_group(); MAPNIK_LOG_DEBUG(svg_renderer) << "svg_renderer: End layer processing=" << lay.name(); } diff --git a/src/svg/svg_parser.cpp b/src/svg/svg_parser.cpp index 5ec93e07e..1a322ac2c 100644 --- a/src/svg/svg_parser.cpp +++ b/src/svg/svg_parser.cpp @@ -29,6 +29,7 @@ #include "agg_ellipse.h" #include "agg_rounded_rect.h" #include "agg_span_gradient.h" +#include "agg_color_rgba.h" #include #include @@ -42,8 +43,30 @@ #include #include +// xml2 +#include + + namespace mapnik { namespace svg { +bool parse_reader(svg_parser & parser,xmlTextReaderPtr reader); +void process_node(svg_parser & parser,xmlTextReaderPtr reader); +void start_element(svg_parser & parser,xmlTextReaderPtr reader); +void end_element(svg_parser & parser,xmlTextReaderPtr reader); +void parse_path(svg_parser & parser,xmlTextReaderPtr reader); +void parse_dimensions(svg_parser & parser,xmlTextReaderPtr reader); +void parse_polygon(svg_parser & parser,xmlTextReaderPtr reader); +void parse_polyline(svg_parser & parser,xmlTextReaderPtr reader); +void parse_line(svg_parser & parser,xmlTextReaderPtr reader); +void parse_rect(svg_parser & parser,xmlTextReaderPtr reader); +void parse_circle(svg_parser & parser,xmlTextReaderPtr reader); +void parse_ellipse(svg_parser & parser,xmlTextReaderPtr reader); +void parse_linear_gradient(svg_parser & parser,xmlTextReaderPtr reader); +void parse_radial_gradient(svg_parser & parser,xmlTextReaderPtr reader); +bool parse_common_gradient(svg_parser & parser,xmlTextReaderPtr reader); +void parse_gradient_stop(svg_parser & parser,xmlTextReaderPtr reader); +void parse_attr(svg_parser & parser,xmlTextReaderPtr reader); +void parse_attr(svg_parser & parser,const xmlChar * name, const xmlChar * value ); typedef std::vector > color_lookup_type; @@ -76,7 +99,7 @@ agg::rgba8 parse_color(const char* str) { c = mapnik::parse_color(str); } - catch (mapnik::config_error & ex) + catch (mapnik::config_error const& ex) { MAPNIK_LOG_ERROR(svg_parser) << ex.what(); } @@ -124,48 +147,13 @@ bool parse_style (const char* str, pairs_type & v) return phrase_parse(str, str + std::strlen(str), kv_parser, skip_type(), v); } -svg_parser::svg_parser(svg_converter > & path) - : path_(path), - is_defs_(false) -{} - -svg_parser::~svg_parser() {} - -void svg_parser::parse(std::string const& filename) -{ - xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename.c_str()); - if (reader == NULL) - { - MAPNIK_LOG_ERROR(svg_parser) << "Unable to open '" << filename << "'"; - } - else if (!parse_reader(reader)) - { - MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << filename << "'"; - } -} - -void svg_parser::parse_from_string(std::string const& svg) -{ - xmlTextReaderPtr reader = xmlReaderForMemory(svg.c_str(),svg.size(),NULL,NULL, - (XML_PARSE_NOBLANKS | XML_PARSE_NOCDATA | XML_PARSE_NOERROR | XML_PARSE_NOWARNING)); - if (reader == NULL) - { - MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << svg << "'"; - } - else if (!parse_reader(reader)) - { - MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << svg << "'"; - } -} - -bool svg_parser::parse_reader(xmlTextReaderPtr reader) +bool parse_reader(svg_parser & parser, xmlTextReaderPtr reader) { int ret = xmlTextReaderRead(reader); try { while (ret == 1) { - process_node(reader); + process_node(parser,reader); ret = xmlTextReaderRead(reader); } } @@ -183,23 +171,8 @@ bool svg_parser::parse_reader(xmlTextReaderPtr reader) return true; } -void svg_parser::process_node(xmlTextReaderPtr reader) -{ - int node_type = xmlTextReaderNodeType(reader); - switch (node_type) - { - case 1: //start element - start_element(reader); - break; - case 15:// end element - end_element(reader); - break; - default: - break; - } -} -void svg_parser::start_element(xmlTextReaderPtr reader) +void start_element(svg_parser & parser, xmlTextReaderPtr reader) { const xmlChar *name; name = xmlTextReaderConstName(reader); @@ -207,63 +180,70 @@ void svg_parser::start_element(xmlTextReaderPtr reader) if (xmlStrEqual(name, BAD_CAST "defs")) { if (xmlTextReaderIsEmptyElement(reader) == 0) - is_defs_ = true; + parser.is_defs_ = true; } // the gradient tags *should* be in defs, but illustrator seems not to put them in there so // accept them anywhere else if (xmlStrEqual(name, BAD_CAST "linearGradient")) { - parse_linear_gradient(reader); + parse_linear_gradient(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "radialGradient")) { - parse_radial_gradient(reader); + parse_radial_gradient(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "stop")) { - parse_gradient_stop(reader); + parse_gradient_stop(parser,reader); } - if ( !is_defs_ ) + if ( !parser.is_defs_ ) { if (xmlStrEqual(name, BAD_CAST "g")) { - path_.push_attr(); - parse_attr(reader); + if (xmlTextReaderIsEmptyElement(reader) == 0) + { + parser.path_.push_attr(); + parse_attr(parser,reader); + } } else { - path_.push_attr(); - parse_attr(reader); - if (path_.display()) + parser.path_.push_attr(); + parse_attr(parser,reader); + if (parser.path_.display()) { if (xmlStrEqual(name, BAD_CAST "path")) { - parse_path(reader); + parse_path(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "polygon") ) { - parse_polygon(reader); + parse_polygon(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "polyline")) { - parse_polyline(reader); + parse_polyline(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "line")) { - parse_line(reader); + parse_line(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "rect")) { - parse_rect(reader); + parse_rect(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "circle")) { - parse_circle(reader); + parse_circle(parser,reader); } else if (xmlStrEqual(name, BAD_CAST "ellipse")) { - parse_ellipse(reader); + parse_ellipse(parser,reader); + } + else if (xmlStrEqual(name, BAD_CAST "svg")) + { + parse_dimensions(parser,reader); } #ifdef MAPNIK_LOG else if (!xmlStrEqual(name, BAD_CAST "svg")) @@ -272,45 +252,61 @@ void svg_parser::start_element(xmlTextReaderPtr reader) } #endif } - path_.pop_attr(); + parser.path_.pop_attr(); } } } -void svg_parser::end_element(xmlTextReaderPtr reader) +void end_element(svg_parser & parser, xmlTextReaderPtr reader) { const xmlChar *name; name = xmlTextReaderConstName(reader); - if (!is_defs_ && xmlStrEqual(name, BAD_CAST "g")) + if (!parser.is_defs_ && xmlStrEqual(name, BAD_CAST "g")) { - path_.pop_attr(); + parser.path_.pop_attr(); } else if (xmlStrEqual(name, BAD_CAST "defs")) { - is_defs_ = false; + parser.is_defs_ = false; } else if ((xmlStrEqual(name, BAD_CAST "linearGradient")) || (xmlStrEqual(name, BAD_CAST "radialGradient"))) { - gradient_map_[temporary_gradient_.first] = temporary_gradient_.second; + parser.gradient_map_[parser.temporary_gradient_.first] = parser.temporary_gradient_.second; } } -void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value ) +void process_node(svg_parser & parser, xmlTextReaderPtr reader) +{ + int node_type = xmlTextReaderNodeType(reader); + switch (node_type) + { + case 1: //start element + start_element(parser,reader); + break; + case 15:// end element + end_element(parser,reader); + break; + default: + break; + } +} + +void parse_attr(svg_parser & parser, const xmlChar * name, const xmlChar * value ) { if (xmlStrEqual(name, BAD_CAST "transform")) { agg::trans_affine tr; mapnik::svg::parse_transform((const char*) value,tr); - path_.transform().premultiply(tr); + parser.path_.transform().premultiply(tr); } else if (xmlStrEqual(name, BAD_CAST "fill")) { if (xmlStrEqual(value, BAD_CAST "none")) { - path_.fill_none(); + parser.path_.fill_none(); } else if (boost::starts_with((const char*)value, "url(#")) { @@ -318,9 +314,9 @@ void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value ) std::string id = std::string((const char*)&value[5]); // get rid of the trailing ) id.erase(id.end()-1); - if (gradient_map_.count(id) > 0) + if (parser.gradient_map_.count(id) > 0) { - path_.add_fill_gradient(gradient_map_[id]); + parser.path_.add_fill_gradient(parser.gradient_map_[id]); } else { @@ -329,25 +325,25 @@ void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value ) } else { - path_.fill(parse_color((const char*) value)); + parser.path_.fill(parse_color((const char*) value)); } } else if (xmlStrEqual(name, BAD_CAST "fill-opacity")) { - path_.fill_opacity(parse_double((const char*) value)); + parser.path_.fill_opacity(parse_double((const char*) value)); } else if (xmlStrEqual(name, BAD_CAST "fill-rule")) { if (xmlStrEqual(value, BAD_CAST "evenodd")) { - path_.even_odd(true); + parser.path_.even_odd(true); } } else if (xmlStrEqual(name, BAD_CAST "stroke")) { if (xmlStrEqual(value, BAD_CAST "none")) { - path_.stroke_none(); + parser.path_.stroke_none(); } else if (boost::starts_with((const char*)value, "url(#")) { @@ -355,9 +351,9 @@ void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value ) std::string id = std::string((const char*)&value[5]); // get rid of the trailing ) id.erase(id.end()-1); - if (gradient_map_.count(id) > 0) + if (parser.gradient_map_.count(id) > 0) { - path_.add_stroke_gradient(gradient_map_[id]); + parser.path_.add_stroke_gradient(parser.gradient_map_[id]); } else { @@ -366,62 +362,61 @@ void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value ) } else { - path_.stroke(parse_color((const char*) value)); + parser.path_.stroke(parse_color((const char*) value)); } } else if (xmlStrEqual(name, BAD_CAST "stroke-width")) { - path_.stroke_width(parse_double((const char*)value)); + parser.path_.stroke_width(parse_double((const char*)value)); } else if (xmlStrEqual(name, BAD_CAST "stroke-opacity")) { - path_.stroke_opacity(parse_double((const char*)value)); + parser.path_.stroke_opacity(parse_double((const char*)value)); } else if(xmlStrEqual(name,BAD_CAST "stroke-width")) { - path_.stroke_width(parse_double((const char*) value)); + parser.path_.stroke_width(parse_double((const char*) value)); } else if(xmlStrEqual(name,BAD_CAST "stroke-linecap")) { if(xmlStrEqual(value,BAD_CAST "butt")) - path_.line_cap(agg::butt_cap); + parser.path_.line_cap(agg::butt_cap); else if(xmlStrEqual(value,BAD_CAST "round")) - path_.line_cap(agg::round_cap); + parser.path_.line_cap(agg::round_cap); else if(xmlStrEqual(value,BAD_CAST "square")) - path_.line_cap(agg::square_cap); + parser.path_.line_cap(agg::square_cap); } else if(xmlStrEqual(name,BAD_CAST "stroke-linejoin")) { if(xmlStrEqual(value,BAD_CAST "miter")) - path_.line_join(agg::miter_join); + parser.path_.line_join(agg::miter_join); else if(xmlStrEqual(value,BAD_CAST "round")) - path_.line_join(agg::round_join); + parser.path_.line_join(agg::round_join); else if(xmlStrEqual(value,BAD_CAST "bevel")) - path_.line_join(agg::bevel_join); + parser.path_.line_join(agg::bevel_join); } else if(xmlStrEqual(name,BAD_CAST "stroke-miterlimit")) { - path_.miter_limit(parse_double((const char*)value)); + parser.path_.miter_limit(parse_double((const char*)value)); } else if(xmlStrEqual(name, BAD_CAST "opacity")) { double opacity = parse_double((const char*)value); - path_.stroke_opacity(opacity); - path_.fill_opacity(opacity); + parser.path_.opacity(opacity); } else if (xmlStrEqual(name, BAD_CAST "visibility")) { - path_.visibility(!xmlStrEqual(value, BAD_CAST "hidden")); + parser.path_.visibility(!xmlStrEqual(value, BAD_CAST "hidden")); } else if (xmlStrEqual(name, BAD_CAST "display") && xmlStrEqual(value, BAD_CAST "none")) { - path_.display(false); + parser.path_.display(false); } } -void svg_parser::parse_attr(xmlTextReaderPtr reader) +void parse_attr(svg_parser & parser, xmlTextReaderPtr reader) { const xmlChar *name, *value; @@ -440,18 +435,40 @@ void svg_parser::parse_attr(xmlTextReaderPtr reader) parse_style((const char*)value, vec); BOOST_FOREACH(value_type kv , vec ) { - parse_attr(BAD_CAST kv.first.c_str(),BAD_CAST kv.second.c_str()); + parse_attr(parser,BAD_CAST kv.first.c_str(),BAD_CAST kv.second.c_str()); } } else { - parse_attr(name,value); + parse_attr(parser,name,value); } } while(xmlTextReaderMoveToNextAttribute(reader) == 1); } xmlTextReaderMoveToElement(reader); } -void svg_parser::parse_path(xmlTextReaderPtr reader) + +void parse_dimensions(svg_parser & parser, xmlTextReaderPtr reader) +{ + xmlChar *value; + double width = 0; + double height = 0; + value = xmlTextReaderGetAttribute(reader, BAD_CAST "width"); + if (value) + { + width = parse_double((const char*)value); + xmlFree(value); + } + xmlChar *value2; + value2 = xmlTextReaderGetAttribute(reader, BAD_CAST "width"); + if (value2) + { + height = parse_double((const char*)value2); + xmlFree(value2); + } + parser.path_.set_dimensions(width,height); + +} +void parse_path(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; @@ -465,9 +482,9 @@ void svg_parser::parse_path(xmlTextReaderPtr reader) } else { - path_.begin_path(); + parser.path_.begin_path(); - if (!mapnik::svg::parse_path((const char*) value, path_)) + if (!mapnik::svg::parse_path((const char*) value, parser.path_)) { xmlFree(value); xmlChar *id_value; @@ -483,51 +500,51 @@ void svg_parser::parse_path(xmlTextReaderPtr reader) throw std::runtime_error("unable to parse invalid svg "); } } - path_.end_path(); + parser.path_.end_path(); xmlFree(value); } } } -void svg_parser::parse_polygon(xmlTextReaderPtr reader) +void parse_polygon(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; value = xmlTextReaderGetAttribute(reader, BAD_CAST "points"); if (value) { - path_.begin_path(); - if (!mapnik::svg::parse_points((const char*) value, path_)) + parser.path_.begin_path(); + if (!mapnik::svg::parse_points((const char*) value, parser.path_)) { xmlFree(value); throw std::runtime_error("Failed to parse "); } - path_.close_subpath(); - path_.end_path(); + parser.path_.close_subpath(); + parser.path_.end_path(); xmlFree(value); } } -void svg_parser::parse_polyline(xmlTextReaderPtr reader) +void parse_polyline(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; value = xmlTextReaderGetAttribute(reader, BAD_CAST "points"); if (value) { - path_.begin_path(); - if (!mapnik::svg::parse_points((const char*) value, path_)) + parser.path_.begin_path(); + if (!mapnik::svg::parse_points((const char*) value, parser.path_)) { xmlFree(value); throw std::runtime_error("Failed to parse "); } - path_.end_path(); + parser.path_.end_path(); xmlFree(value); } } -void svg_parser::parse_line(xmlTextReaderPtr reader) +void parse_line(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; double x1 = 0.0; @@ -563,14 +580,14 @@ void svg_parser::parse_line(xmlTextReaderPtr reader) xmlFree(value); } - path_.begin_path(); - path_.move_to(x1, y1); - path_.line_to(x2, y2); - path_.end_path(); + parser.path_.begin_path(); + parser.path_.move_to(x1, y1); + parser.path_.line_to(x2, y2); + parser.path_.end_path(); } -void svg_parser::parse_circle(xmlTextReaderPtr reader) +void parse_circle(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; double cx = 0.0; @@ -597,19 +614,19 @@ void svg_parser::parse_circle(xmlTextReaderPtr reader) xmlFree(value); } - path_.begin_path(); + parser.path_.begin_path(); if(r != 0.0) { if(r < 0.0) throw std::runtime_error("parse_circle: Invalid radius"); agg::ellipse c(cx, cy, r, r); - path_.storage().concat_path(c); + parser.path_.storage().concat_path(c); } - path_.end_path(); + parser.path_.end_path(); } -void svg_parser::parse_ellipse(xmlTextReaderPtr reader) +void parse_ellipse(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; double cx = 0.0; @@ -645,21 +662,21 @@ void svg_parser::parse_ellipse(xmlTextReaderPtr reader) xmlFree(value); } - path_.begin_path(); + parser.path_.begin_path(); if(rx != 0.0 && ry != 0.0) { if(rx < 0.0) throw std::runtime_error("parse_ellipse: Invalid rx"); if(ry < 0.0) throw std::runtime_error("parse_ellipse: Invalid ry"); agg::ellipse c(cx, cy, rx, ry); - path_.storage().concat_path(c); + parser.path_.storage().concat_path(c); } - path_.end_path(); + parser.path_.end_path(); } -void svg_parser::parse_rect(xmlTextReaderPtr reader) +void parse_rect(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; double x = 0.0; @@ -727,24 +744,24 @@ void svg_parser::parse_rect(xmlTextReaderPtr reader) if(h < 0.0) throw std::runtime_error("parse_rect: Invalid height"); if(rx < 0.0) throw std::runtime_error("parse_rect: Invalid rx"); if(ry < 0.0) throw std::runtime_error("parse_rect: Invalid ry"); - path_.begin_path(); + parser.path_.begin_path(); if(rounded) { agg::rounded_rect r; r.rect(x,y,x+w,y+h); r.radius(rx,ry); - path_.storage().concat_path(r); + parser.path_.storage().concat_path(r); } else { - path_.move_to(x, y); - path_.line_to(x + w, y); - path_.line_to(x + w, y + h); - path_.line_to(x, y + h); - path_.close_subpath(); + parser.path_.move_to(x, y); + parser.path_.line_to(x + w, y); + parser.path_.line_to(x + w, y + h); + parser.path_.line_to(x, y + h); + parser.path_.close_subpath(); } - path_.end_path(); + parser.path_.end_path(); } } @@ -755,7 +772,7 @@ void svg_parser::parse_rect(xmlTextReaderPtr reader) offset="1" id="stop3763" /> */ -void svg_parser::parse_gradient_stop(xmlTextReaderPtr reader) +void parse_gradient_stop(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; @@ -786,7 +803,7 @@ void svg_parser::parse_gradient_stop(xmlTextReaderPtr reader) { stop_color = mapnik::parse_color(kv.second.c_str()); } - catch (mapnik::config_error & ex) + catch (mapnik::config_error const& ex) { MAPNIK_LOG_ERROR(svg_parser) << ex.what(); } @@ -806,7 +823,7 @@ void svg_parser::parse_gradient_stop(xmlTextReaderPtr reader) { stop_color = mapnik::parse_color((const char *) value); } - catch (mapnik::config_error & ex) + catch (mapnik::config_error const& ex) { MAPNIK_LOG_ERROR(svg_parser) << ex.what(); } @@ -823,7 +840,7 @@ void svg_parser::parse_gradient_stop(xmlTextReaderPtr reader) stop_color.set_alpha(opacity*255); - temporary_gradient_.second.add_stop(offset, stop_color); + parser.temporary_gradient_.second.add_stop(offset, stop_color); /* MAPNIK_LOG_DEBUG(svg_parser) << "\tFound Stop: " << offset << " " @@ -834,7 +851,7 @@ void svg_parser::parse_gradient_stop(xmlTextReaderPtr reader) */ } -bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader) +bool parse_common_gradient(svg_parser & parser, xmlTextReaderPtr reader) { xmlChar *value; @@ -845,7 +862,7 @@ bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader) // start a new gradient gradient new_grad; id = std::string((const char *) value); - temporary_gradient_ = std::make_pair(id, new_grad); + parser.temporary_gradient_ = std::make_pair(id, new_grad); xmlFree(value); } else @@ -861,9 +878,9 @@ bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader) if (value[0] == '#') { std::string linkid = (const char *) &value[1]; - if (gradient_map_.count(linkid)) + if (parser.gradient_map_.count(linkid)) { - temporary_gradient_.second = gradient_map_[linkid]; + parser.temporary_gradient_.second = parser.gradient_map_[linkid]; } else { @@ -878,11 +895,11 @@ bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader) { if (xmlStrEqual(value, BAD_CAST "userSpaceOnUse")) { - temporary_gradient_.second.set_units(USER_SPACE_ON_USE); + parser.temporary_gradient_.second.set_units(USER_SPACE_ON_USE); } else { - temporary_gradient_.second.set_units(OBJECT_BOUNDING_BOX); + parser.temporary_gradient_.second.set_units(OBJECT_BOUNDING_BOX); } xmlFree(value); } @@ -892,7 +909,7 @@ bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader) { agg::trans_affine tr; mapnik::svg::parse_transform((const char*) value,tr); - temporary_gradient_.second.set_transform(tr); + parser.temporary_gradient_.second.set_transform(tr); xmlFree(value); } @@ -911,9 +928,9 @@ bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader) r="5.1999998" gradientUnits="userSpaceOnUse" /> */ -void svg_parser::parse_radial_gradient(xmlTextReaderPtr reader) +void parse_radial_gradient(svg_parser & parser, xmlTextReaderPtr reader) { - if (!parse_common_gradient(reader)) + if (!parse_common_gradient(parser,reader)) return; xmlChar *value; @@ -963,22 +980,22 @@ void svg_parser::parse_radial_gradient(xmlTextReaderPtr reader) xmlFree(value); } // this logic for detecting %'s will not support mixed coordinates. - if (has_percent && temporary_gradient_.second.get_units() == USER_SPACE_ON_USE) + if (has_percent && parser.temporary_gradient_.second.get_units() == USER_SPACE_ON_USE) { - temporary_gradient_.second.set_units(USER_SPACE_ON_USE_BOUNDING_BOX); + parser.temporary_gradient_.second.set_units(USER_SPACE_ON_USE_BOUNDING_BOX); } - temporary_gradient_.second.set_gradient_type(RADIAL); - temporary_gradient_.second.set_control_points(fx,fy,cx,cy,r); + parser.temporary_gradient_.second.set_gradient_type(RADIAL); + parser.temporary_gradient_.second.set_control_points(fx,fy,cx,cy,r); // add this here in case we have no end tag, will be replaced if we do - gradient_map_[temporary_gradient_.first] = temporary_gradient_.second; + parser.gradient_map_[parser.temporary_gradient_.first] = parser.temporary_gradient_.second; //MAPNIK_LOG_DEBUG(svg_parser) << "Found Radial Gradient: " << " " << cx << " " << cy << " " << fx << " " << fy << " " << r; } -void svg_parser::parse_linear_gradient(xmlTextReaderPtr reader) +void parse_linear_gradient(svg_parser & parser, xmlTextReaderPtr reader) { - if (!parse_common_gradient(reader)) + if (!parse_common_gradient(parser,reader)) return; xmlChar *value; @@ -1016,22 +1033,52 @@ void svg_parser::parse_linear_gradient(xmlTextReaderPtr reader) xmlFree(value); } // this logic for detecting %'s will not support mixed coordinates. - if (has_percent && temporary_gradient_.second.get_units() == USER_SPACE_ON_USE) + if (has_percent && parser.temporary_gradient_.second.get_units() == USER_SPACE_ON_USE) { - temporary_gradient_.second.set_units(USER_SPACE_ON_USE_BOUNDING_BOX); + parser.temporary_gradient_.second.set_units(USER_SPACE_ON_USE_BOUNDING_BOX); } - temporary_gradient_.second.set_gradient_type(LINEAR); - temporary_gradient_.second.set_control_points(x1,y1,x2,y2); + parser.temporary_gradient_.second.set_gradient_type(LINEAR); + parser.temporary_gradient_.second.set_control_points(x1,y1,x2,y2); // add this here in case we have no end tag, will be replaced if we do - gradient_map_[temporary_gradient_.first] = temporary_gradient_.second; + parser.gradient_map_[parser.temporary_gradient_.first] = parser.temporary_gradient_.second; //MAPNIK_LOG_DEBUG(svg_parser) << "Found Linear Gradient: " << "(" << x1 << " " << y1 << "),(" << x2 << " " << y2 << ")"; } -void svg_parser::parse_pattern(xmlTextReaderPtr reader) +svg_parser::svg_parser(svg_converter > & path) + : path_(path), + is_defs_(false) {} + +svg_parser::~svg_parser() {} + +void svg_parser::parse(std::string const& filename) { - //const xmlChar *value; + xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename.c_str()); + if (reader == NULL) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to open '" << filename << "'"; + } + else if (!parse_reader(*this,reader)) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << filename << "'"; + } } +void svg_parser::parse_from_string(std::string const& svg) +{ + xmlTextReaderPtr reader = xmlReaderForMemory(svg.c_str(),svg.size(),NULL,NULL, + (XML_PARSE_NOBLANKS | XML_PARSE_NOCDATA | XML_PARSE_NOERROR | XML_PARSE_NOWARNING)); + if (reader == NULL) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << svg << "'"; + } + else if (!parse_reader(*this,reader)) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << svg << "'"; + } +} + + }} diff --git a/src/symbolizer.cpp b/src/symbolizer.cpp index a1637653a..1a09e0ce8 100644 --- a/src/symbolizer.cpp +++ b/src/symbolizer.cpp @@ -21,8 +21,9 @@ *****************************************************************************/ //mapnik -#include #include +#include +#include #include namespace mapnik { diff --git a/src/symbolizer_helpers.cpp b/src/symbolizer_helpers.cpp index b859da27f..683eeee00 100644 --- a/src/symbolizer_helpers.cpp +++ b/src/symbolizer_helpers.cpp @@ -32,12 +32,49 @@ #include #include #include +#include // agg #include "agg_conv_clip_polyline.h" namespace mapnik { +template +text_symbolizer_helper::text_symbolizer_helper(text_symbolizer const& sym, + feature_impl const& feature, + proj_transform const& prj_trans, + unsigned width, + unsigned height, + double scale_factor, + CoordTransform const& t, + FaceManagerT &font_manager, + DetectorT &detector, + box2d const& query_extent) + : sym_(sym), + feature_(feature), + prj_trans_(prj_trans), + t_(t), + font_manager_(font_manager), + detector_(detector), + dims_(0, 0, width, height), + query_extent_(query_extent), + text_(font_manager, scale_factor), + angle_(0.0), + placement_valid_(false), + points_on_line_(false), + finder_(0) + { + initialize_geometries(); + if (!geometries_to_process_.size()) return; + placement_ = sym_.get_placement_options()->get_placement_info(scale_factor); + next_placement(); + initialize_points(); + } + +template +text_symbolizer_helper::~text_symbolizer_helper() +{} + template bool text_symbolizer_helper::next() { @@ -282,7 +319,6 @@ bool text_symbolizer_helper::next_placement() return false; } placement_->properties.process(text_, feature_); - info_ = &(text_.get_string_info()); if (placement_->properties.orientation) { // https://github.com/mapnik/mapnik/issues/1352 @@ -294,10 +330,9 @@ bool text_symbolizer_helper::next_placement() angle_ = 0.0; } - - finder_ = boost::shared_ptr >(new placement_finder(feature_, *placement_, *info_, detector_, dims_)); -// boost::make_shared >(feature_, *placement_, *info_, detector_, dims_); - + finder_.reset(new placement_finder(*placement_, + text_.get_string_info(), + detector_, dims_)); placement_valid_ = true; return true; } @@ -469,4 +504,5 @@ agg::trans_affine const& shield_symbolizer_helper::get_ template class text_symbolizer_helper, label_collision_detector4>; template class shield_symbolizer_helper, label_collision_detector4>; +template class mapnik::placement_finder; } //namespace diff --git a/src/text_symbolizer.cpp b/src/text_symbolizer.cpp index 8aed6297b..61ea9f6ac 100644 --- a/src/text_symbolizer.cpp +++ b/src/text_symbolizer.cpp @@ -34,6 +34,15 @@ namespace mapnik { +static const char * halo_rasterizer_strings[] = { + "full", + "fast", + "" +}; + +IMPLEMENT_ENUM( halo_rasterizer_e, halo_rasterizer_strings ) + + static const char * label_placement_strings[] = { "point", "line", @@ -92,7 +101,8 @@ IMPLEMENT_ENUM( text_transform_e, text_transform_strings ) text_symbolizer::text_symbolizer(text_placements_ptr placements) : symbolizer_base(), - placement_options_(placements) + placement_options_(placements), + halo_rasterizer_(HALO_RASTERIZER_FULL) { } @@ -101,7 +111,8 @@ text_symbolizer::text_symbolizer(expression_ptr name, std::string const& face_na float size, color const& fill, text_placements_ptr placements) : symbolizer_base(), - placement_options_(placements) + placement_options_(placements), + halo_rasterizer_(HALO_RASTERIZER_FULL) { set_name(name); set_face_name(face_name); @@ -112,7 +123,8 @@ text_symbolizer::text_symbolizer(expression_ptr name, std::string const& face_na text_symbolizer::text_symbolizer(expression_ptr name, float size, color const& fill, text_placements_ptr placements) : symbolizer_base(), - placement_options_(placements) + placement_options_(placements), + halo_rasterizer_(HALO_RASTERIZER_FULL) { set_name(name); set_text_size(size); @@ -121,7 +133,9 @@ text_symbolizer::text_symbolizer(expression_ptr name, float size, color const& f text_symbolizer::text_symbolizer(text_symbolizer const& rhs) : symbolizer_base(rhs), - placement_options_(rhs.placement_options_) /*TODO: Copy options! */ + placement_options_(rhs.placement_options_), + halo_rasterizer_(rhs.halo_rasterizer_) + /*TODO: Copy options! */ { } @@ -130,9 +144,7 @@ text_symbolizer& text_symbolizer::operator=(text_symbolizer const& other) if (this == &other) return *this; placement_options_ = other.placement_options_; /*TODO: Copy options? */ - - MAPNIK_LOG_DEBUG(text_symbolizer) << "text_symbolizer: TODO - Metawriter (text_symbolizer::operator=)"; - + halo_rasterizer_ = other.halo_rasterizer_; return *this; } @@ -338,6 +350,16 @@ double text_symbolizer::get_halo_radius() const return placement_options_->defaults.format.halo_radius; } +void text_symbolizer::set_halo_rasterizer(halo_rasterizer_e rasterizer_p) +{ + halo_rasterizer_ = rasterizer_p; +} + +halo_rasterizer_e text_symbolizer::get_halo_rasterizer() const +{ + return halo_rasterizer_; +} + void text_symbolizer::set_label_placement(label_placement_e label_p) { placement_options_->defaults.label_placement = label_p; diff --git a/src/tiff_reader.cpp b/src/tiff_reader.cpp index 43a3beac1..a92e99c34 100644 --- a/src/tiff_reader.cpp +++ b/src/tiff_reader.cpp @@ -23,9 +23,14 @@ // mapnik #include #include + // boost #include -#include + +// iostreams +#include +#include +#include extern "C" { @@ -35,12 +40,75 @@ extern "C" namespace mapnik { -using std::min; -using std::max; +namespace impl { +static toff_t tiff_seek_proc(thandle_t fd, toff_t off, int whence) +{ + std::istream* in = reinterpret_cast(fd); + + switch(whence) + { + case SEEK_SET: + in->seekg(off, std::ios_base::beg); + break; + case SEEK_CUR: + in->seekg(off, std::ios_base::cur); + break; + case SEEK_END: + in->seekg(off, std::ios_base::end); + break; + } + return static_cast(in->tellg()); +} + +static int tiff_close_proc(thandle_t /*fd*/) +{ + return 0; +} + +static toff_t tiff_size_proc(thandle_t fd) +{ + std::istream* in = reinterpret_cast(fd); + std::ios::pos_type pos = in->tellg(); + in->seekg(0, std::ios::end); + std::ios::pos_type len = in->tellg(); + in->seekg(pos); + return static_cast(len); +} + +static tsize_t tiff_read_proc(thandle_t fd, tdata_t buf, tsize_t size) +{ + std::istream * in = reinterpret_cast(fd); + std::streamsize request_size = size; + if (static_cast(request_size) != size) + return static_cast(-1); + in->read(reinterpret_cast(buf), request_size); + return static_cast(in->gcount()); +} + +static tsize_t tiff_write_proc(thandle_t /*fd*/, tdata_t /*buf*/, tsize_t /*size*/) +{ + return 0; +} + +static void tiff_unmap_proc(thandle_t /*fd*/, tdata_t /*base*/, toff_t /*size*/) +{ +} + +static int tiff_map_proc(thandle_t /*fd*/, tdata_t* /*pbase*/, toff_t* /*psize*/) +{ + return 0; +} + +} + +template class tiff_reader : public image_reader { typedef boost::shared_ptr tiff_ptr; + typedef T source_type; + typedef boost::iostreams::stream input_stream; + struct tiff_closer { void operator() (TIFF * tif) @@ -53,10 +121,11 @@ class tiff_reader : public image_reader }; private: - std::string file_name_; + source_type source_; + input_stream stream_; int read_method_; - unsigned width_; - unsigned height_; + std::size_t width_; + std::size_t height_; int rows_per_strip_; int tile_width_; int tile_height_; @@ -69,6 +138,7 @@ public: tiled }; 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; @@ -81,21 +151,32 @@ private: 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); - TIFF* load_if_exists(std::string const& filename); + TIFF* open(std::istream & input); + static void on_error(const char* /*module*/, const char* fmt, va_list argptr); }; namespace { + image_reader* create_tiff_reader(std::string const& file) { - return new tiff_reader(file); + return new tiff_reader(file); +} + +image_reader* create_tiff_reader2(char const * data, std::size_t size) +{ + return new tiff_reader(data, size); } const bool registered = register_image_reader("tiff",create_tiff_reader); +const bool registered2 = register_image_reader("tiff", create_tiff_reader2); + } -tiff_reader::tiff_reader(std::string const& file_name) - : file_name_(file_name), +template +tiff_reader::tiff_reader(std::string const& file_name) + : source_(file_name, std::ios_base::in | std::ios_base::binary), + stream_(source_), read_method_(generic), width_(0), height_(0), @@ -104,16 +185,49 @@ tiff_reader::tiff_reader(std::string const& file_name) tile_height_(0), premultiplied_alpha_(false) { + if (!stream_) throw image_reader_exception("TIFF reader: cannot open file "+ file_name); init(); } - -void tiff_reader::init() +template +tiff_reader::tiff_reader(char const* data, std::size_t size) + : source_(data, size), + stream_(source_), + read_method_(generic), + width_(0), + height_(0), + rows_per_strip_(0), + tile_width_(0), + tile_height_(0), + premultiplied_alpha_(false) +{ + if (!stream_) throw image_reader_exception("TIFF reader: cannot open image stream "); + stream_.seekg(0, std::ios::beg); + init(); +} + +template +void tiff_reader::on_error(const char* /*module*/, const char* fmt, va_list argptr) +{ + char msg[10240]; + vsprintf(msg, fmt, argptr); + throw image_reader_exception(msg); +} + +template +void tiff_reader::init() { - // TODO: error handling TIFFSetWarningHandler(0); - TIFF* tif = load_if_exists(file_name_); - if (!tif) throw image_reader_exception( std::string("Can't load tiff file: '") + file_name_ + "'"); + // Note - we intentially set the error handling to null + // when opening the image for the first time to avoid + // leaking in TiffOpen: https://github.com/mapnik/mapnik/issues/1783 + TIFFSetErrorHandler(0); + + TIFF* tif = open(stream_); + + if (!tif) throw image_reader_exception("Can't open tiff file"); + + TIFFSetErrorHandler(on_error); char msg[1024]; @@ -148,29 +262,31 @@ void tiff_reader::init() } } - -tiff_reader::~tiff_reader() +template +tiff_reader::~tiff_reader() { } - -unsigned tiff_reader::width() const +template +unsigned tiff_reader::width() const { return width_; } - -unsigned tiff_reader::height() const +template +unsigned tiff_reader::height() const { return height_; } -bool tiff_reader::premultiplied_alpha() const +template +bool tiff_reader::premultiplied_alpha() const { return premultiplied_alpha_; } -void tiff_reader::read(unsigned x,unsigned y,image_data_32& image) +template +void tiff_reader::read(unsigned x,unsigned y,image_data_32& image) { if (read_method_==stripped) { @@ -186,20 +302,20 @@ void tiff_reader::read(unsigned x,unsigned y,image_data_32& image) } } - -void tiff_reader::read_generic(unsigned /*x*/,unsigned /*y*/,image_data_32& /*image*/) +template +void tiff_reader::read_generic(unsigned /*x*/,unsigned /*y*/,image_data_32& /*image*/) { - TIFF* tif = load_if_exists(file_name_); + TIFF* tif = open(stream_); if (tif) { MAPNIK_LOG_DEBUG(tiff_reader) << "tiff_reader: TODO - tiff is not stripped or tiled"; } } - -void tiff_reader::read_tiled(unsigned x0,unsigned y0,image_data_32& image) +template +void tiff_reader::read_tiled(unsigned x0,unsigned y0,image_data_32& image) { - TIFF* tif = load_if_exists(file_name_); + TIFF* tif = open(stream_); if (tif) { uint32* buf = (uint32*)_TIFFmalloc(tile_width_*tile_height_*sizeof(uint32)); @@ -215,8 +331,8 @@ void tiff_reader::read_tiled(unsigned x0,unsigned y0,image_data_32& image) for (int y=start_y;y=n0;--n) { @@ -240,10 +356,10 @@ void tiff_reader::read_tiled(unsigned x0,unsigned y0,image_data_32& image) } } - -void tiff_reader::read_stripped(unsigned x0,unsigned y0,image_data_32& image) +template +void tiff_reader::read_stripped(unsigned x0,unsigned y0,image_data_32& image) { - TIFF* tif = load_if_exists(file_name_); + TIFF* tif = open(stream_); if (tif) { uint32* buf = (uint32*)_TIFFmalloc(width_*rows_per_strip_*sizeof(uint32)); @@ -257,12 +373,12 @@ void tiff_reader::read_stripped(unsigned x0,unsigned y0,image_data_32& image) int row,tx0,tx1,ty0,ty1; tx0=x0; - tx1=min(width+x0,(unsigned)width_); + tx1=std::min(width+x0,(unsigned)width_); for (unsigned y=start_y; y < end_y; y+=rows_per_strip_) { - ty0 = max(y0,y)-y; - ty1 = min(height+y0,y+rows_per_strip_)-y; + ty0 = std::max(y0,y)-y; + ty1 = std::min(height+y0,y+rows_per_strip_)-y; if (!TIFFReadRGBAStrip(tif,y,buf)) break; @@ -280,16 +396,20 @@ void tiff_reader::read_stripped(unsigned x0,unsigned y0,image_data_32& image) } } -TIFF* tiff_reader::load_if_exists(std::string const& filename) +template +TIFF* tiff_reader::open(std::istream & input) { if (!tif_) { - boost::filesystem::path path(file_name_); - if (boost::filesystem::is_regular(path)) // exists and regular file - { - // File path is a full file path and does exist - tif_ = tiff_ptr(TIFFOpen(filename.c_str(), "rb"), tiff_closer()); - } + tif_ = tiff_ptr(TIFFClientOpen("tiff_input_stream", "rm", + reinterpret_cast(&input), + impl::tiff_read_proc, + impl::tiff_write_proc, + impl::tiff_seek_proc, + impl::tiff_close_proc, + impl::tiff_size_proc, + impl::tiff_map_proc, + impl::tiff_unmap_proc), tiff_closer()); } return tif_.get(); } diff --git a/src/utils.cpp b/src/utils.cpp new file mode 100644 index 000000000..a10102889 --- /dev/null +++ b/src/utils.cpp @@ -0,0 +1,61 @@ +/***************************************************************************** + * + * 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 + * + *****************************************************************************/ + +#ifdef _WINDOWS +// windows specific methods for UTF8 from/to UTF16 +#include +#include +#include + +#include + +namespace mapnik { + +std::string utf16_to_utf8(std::wstring const& wstr) +{ + std::string str; + int size = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, 0, 0, 0, 0); + if(size > 0) + { + std::vector buffer(size); + WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &buffer[0], size, 0, 0); + str.assign(buffer.begin(), buffer.end() - 1); + } + return str; +} + +std::wstring utf8_to_utf16 (std::string const& str) +{ + std::wstring wstr; + int size = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0); + if (size > 0) + { + std::vector buffer(size); + MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &buffer[0], size); + wstr.assign(buffer.begin(), buffer.end() - 1); + } + return wstr; +} + +} // namespace mapnik + +#endif // _WINDOWS diff --git a/src/warp.cpp b/src/warp.cpp index c40953053..7a88005f7 100644 --- a/src/warp.cpp +++ b/src/warp.cpp @@ -78,11 +78,9 @@ void reproject_and_scale_raster(raster & target, raster const& source, prj_trans.backward(xs.getData(), ys.getData(), NULL, mesh_nx*mesh_ny); // Initialize AGG objects - typedef agg::pixfmt_rgba32 pixfmt; + typedef agg::pixfmt_rgba32_pre pixfmt; typedef pixfmt::color_type color_type; typedef agg::renderer_base renderer_base; - typedef agg::pixfmt_rgba32_pre pixfmt_pre; - typedef agg::renderer_base renderer_base_pre; agg::rasterizer_scanline_aa<> rasterizer; agg::scanline_u8 scanline; @@ -90,8 +88,8 @@ void reproject_and_scale_raster(raster & target, raster const& source, target.data_.width(), target.data_.height(), target.data_.width()*4); - pixfmt_pre pixf_pre(buf); - renderer_base_pre rb_pre(pixf_pre); + pixfmt pixf(buf); + renderer_base rb(pixf); rasterizer.clip_box(0, 0, target.data_.width(), target.data_.height()); agg::rendering_buffer buf_tile( (unsigned char*)source.data_.getData(), @@ -184,13 +182,13 @@ void reproject_and_scale_raster(raster & target, raster const& source, span_gen_type; span_gen_type sg(ia, interpolator); - agg::render_scanlines_aa(rasterizer, scanline, rb_pre, + agg::render_scanlines_aa(rasterizer, scanline, rb, sa, sg); } else { typedef agg::span_image_resample_rgba_affine span_gen_type; span_gen_type sg(ia, interpolator, filter); - agg::render_scanlines_aa(rasterizer, scanline, rb_pre, + agg::render_scanlines_aa(rasterizer, scanline, rb, sa, sg); } } diff --git a/src/webp_reader.cpp b/src/webp_reader.cpp new file mode 100644 index 000000000..29f87dbd2 --- /dev/null +++ b/src/webp_reader.cpp @@ -0,0 +1,239 @@ +/***************************************************************************** + * + * 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 +#include + +extern "C" +{ +#include +#include +} + +// boost +#include +#include +#include +// stl +#include + +namespace mapnik +{ + +struct external_buffer_policy +{ + external_buffer_policy( uint8_t const* data, std::size_t size) + : data_(data), + size_(size) {} + + uint8_t const* data() const + { + return data_; + } + + std::size_t size() const + { + return size_; + } + + uint8_t const* data_; + std::size_t size_; +}; + +struct internal_buffer_policy +{ + internal_buffer_policy(std::size_t size) + : data_((size!=0) ? static_cast(::operator new(sizeof(uint8_t) * size)) : 0), + size_(size) + {} + + uint8_t * data() const + { + return data_; + } + + std::size_t size() const + { + return size_; + } + + ~internal_buffer_policy() + { + ::operator delete(data_), data_=0; + } + + uint8_t * data_; + std::size_t size_; +}; + +template +class webp_reader : public image_reader +{ + typedef T buffer_policy_type; +private: + struct config_guard + { + config_guard(WebPDecoderConfig & config) + : config_(config) {} + + ~config_guard() + { + WebPFreeDecBuffer(&config_.output); + } + WebPDecoderConfig & config_; + }; + std::auto_ptr buffer_; + size_t size_; + unsigned width_; + unsigned height_; +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; + bool premultiplied_alpha() const { return false; } + void read(unsigned x,unsigned y,image_data_32& image); +private: + void init(); +}; + +namespace +{ +image_reader* create_webp_reader(char const * data, std::size_t size) +{ + return new webp_reader(data, size); +} + +image_reader* create_webp_reader2(std::string const& filename) +{ + return new webp_reader(filename); +} + + +const bool registered = register_image_reader("webp", create_webp_reader); +const bool registered2 = register_image_reader("webp", create_webp_reader2); + +} + +// ctor +template +webp_reader::webp_reader(char const* data, std::size_t size) + : buffer_(new buffer_policy_type(reinterpret_cast(data), size)), + width_(0), + height_(0) +{ + init(); +} + +template +webp_reader::webp_reader(std::string const& filename) + : buffer_(), + size_(0), + width_(0), + height_(0) +{ + std::ifstream file(filename.c_str(), std::ios::binary); + if (!file) + { + throw image_reader_exception("WEBP: Can't read file:" + filename); + } + std::streampos beg = file.tellg(); + file.seekg (0, std::ios::end); + std::streampos end = file.tellg(); + std::size_t file_size = end - beg; + file.seekg (0, std::ios::beg); + buffer_ = std::auto_ptr(new buffer_policy_type(file_size)); + file.read(reinterpret_cast(buffer_->data()), buffer_->size()); + if (!file) + { + throw image_reader_exception("WEBP: Failed to read:" + filename); + } + init(); +} + + +// dtor +template +webp_reader::~webp_reader() +{ + // +} + +template +void webp_reader::init() +{ + int width, height; + if (!WebPGetInfo(buffer_->data(), buffer_->size(), &width, &height)) + { + throw image_reader_exception("WEBP reader: WebPGetInfo failed"); + } + width_ = width; + height_ = height; +} + +template +unsigned webp_reader::width() const +{ + return width_; +} + +template +unsigned webp_reader::height() const +{ + return height_; +} + +template +void webp_reader::read(unsigned x0, unsigned y0,image_data_32& image) +{ + WebPDecoderConfig config; + config_guard guard(config); + if (!WebPInitDecoderConfig(&config)) + { + throw image_reader_exception("WEBP reader: WebPInitDecoderConfig failed"); + } + + 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()); + + if (WebPGetFeatures(buffer_->data(), buffer_->size(), &config.input) != VP8_STATUS_OK) + { + throw image_reader_exception("WEBP reader: WebPGetFeatures failed"); + } + + config.output.colorspace = MODE_RGBA; + config.output.u.RGBA.rgba = (uint8_t *)image.getBytes(); + config.output.u.RGBA.stride = 4 * image.width(); + config.output.u.RGBA.size = image.width() * image.height() * 4; + config.output.is_external_memory = 1; + if (WebPDecode(buffer_->data(), buffer_->size(), &config) != VP8_STATUS_OK) + { + throw image_reader_exception("WEBP reader: WebPDecode failed"); + } +} + +} diff --git a/src/well_known_srs.cpp b/src/well_known_srs.cpp index a6e8d0ae6..c3163df0d 100644 --- a/src/well_known_srs.cpp +++ b/src/well_known_srs.cpp @@ -23,6 +23,7 @@ // mapnik #include #include +#include // boost #include diff --git a/src/wkb.cpp b/src/wkb.cpp index a43754387..ed8c627c3 100644 --- a/src/wkb.cpp +++ b/src/wkb.cpp @@ -82,7 +82,8 @@ public: { if (size_ >= 44 && (unsigned char)(wkb_[0]) == (unsigned char)(0x00) - && (unsigned char)(wkb_[38]) == (unsigned char)(0x7C)) + && (unsigned char)(wkb_[38]) == (unsigned char)(0x7C) + && (unsigned char)(wkb_[size_ - 1]) == (unsigned char)(0xFE)) { format_ = wkbSpatiaLite; } @@ -353,25 +354,14 @@ private: CoordinateArray ar(num_points); read_coords(ar); poly->move_to(ar[0].x, ar[0].y); - for (int j = 1; j < num_points - 1; ++j) + for (int j = 1; j < num_points ; ++j) { poly->line_to(ar[j].x, ar[j].y); } - - if (ar[0].x == ar[num_points-1].x && - ar[0].y == ar[num_points-1].y) - { - poly->close(ar[num_points-1].x, ar[num_points-1].y); - } - else - { - // leave un-closed polygon intact - don't attempt to close them - poly->line_to(ar[num_points-1].x, ar[num_points-1].y); - } - poly->set_close(); + poly->close_path(); } } - if (poly->size() > 2) // ignore if polygon has less than 3 vertices + if (poly->size() > 3) // ignore if polygon has less than (3 + close_path) vertices paths.push_back(poly); } } @@ -400,20 +390,11 @@ private: CoordinateArray ar(num_points); read_coords_xyz(ar); poly->move_to(ar[0].x, ar[0].y); - for (int j = 1; j < num_points - 1; ++j) + for (int j = 1; j < num_points; ++j) { poly->line_to(ar[j].x, ar[j].y); } - if (ar[0].x == ar[num_points-1].x && - ar[0].y == ar[num_points-1].y) - { - poly->close(ar[num_points-1].x, ar[num_points-1].y); - } - else - { - // leave un-closed polygon intact- don't attempt to close them - poly->line_to(ar[num_points-1].x, ar[num_points-1].y); - } + poly->close_path(); } } if (poly->size() > 2) // ignore if polygon has less than 3 vertices @@ -461,7 +442,7 @@ private: case wkbMultiLineStringZ: s << "MultiLineStringZ"; break; case wkbMultiPolygonZ: s << "MultiPolygonZ"; break; case wkbGeometryCollectionZ: s << "GeometryCollectionZ"; break; - default: s << "wkbUknown(" << type << ")"; break; + default: s << "wkbUnknown(" << type << ")"; break; } return s.str(); diff --git a/src/wkt/wkt_factory.cpp b/src/wkt/wkt_factory.cpp index 298b871fa..823965cf4 100644 --- a/src/wkt/wkt_factory.cpp +++ b/src/wkt/wkt_factory.cpp @@ -30,6 +30,8 @@ // stl #include #include +#include + namespace mapnik { diff --git a/src/wkt/wkt_generator.cpp b/src/wkt/wkt_generator.cpp index 03900ee4e..16f81bfe5 100644 --- a/src/wkt/wkt_generator.cpp +++ b/src/wkt/wkt_generator.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -65,8 +66,6 @@ wkt_generator::wkt_generator(bool single) using boost::spirit::karma::_b; using boost::spirit::karma::_c; using boost::spirit::karma::_r1; - using boost::spirit::karma::_r2; - using boost::spirit::karma::_r3; using boost::spirit::karma::eps; using boost::spirit::karma::string; @@ -97,15 +96,12 @@ wkt_generator::wkt_generator(bool single) ; polygon_coord %= ( &uint_(mapnik::SEG_MOVETO) - << eps[_r1 += 1][_a = _r2 = _x(_val)][ _b = _r3 = _y(_val)] + << eps[_r1 += 1][_a = _x(_val)][ _b = _y(_val)] << string[ if_ (_r1 > 1) [_1 = "),("] .else_[_1 = "("]] | &uint_(mapnik::SEG_LINETO) << lit(',') << eps[_a = _x(_val)][_b = _y(_val)] - | - &uint_(mapnik::SEG_CLOSE) - << lit(',') << eps[_a = _r2][_b = _r3] ) << coordinate[_1 = _a] << lit(' ') @@ -156,6 +152,23 @@ wkt_multi_generator::wkt_multi_generator() template struct mapnik::util::wkt_generator, mapnik::geometry_type>; template struct mapnik::util::wkt_multi_generator, mapnik::geometry_container >; +bool to_wkt(std::string & wkt, mapnik::geometry_type const& geom) +{ + typedef std::back_insert_iterator sink_type; + sink_type sink(wkt); + wkt_generator generator(true); + bool result = karma::generate(sink, generator, geom); + return result; +} + +bool to_wkt(std::string & wkt, mapnik::geometry_container const& geom) +{ + typedef std::back_insert_iterator sink_type; + sink_type sink(wkt); + wkt_multi_generator generator; + bool result = karma::generate(sink, generator, geom); + return result; +} }} diff --git a/src/xml_tree.cpp b/src/xml_tree.cpp index 127264de1..53cea607e 100644 --- a/src/xml_tree.cpp +++ b/src/xml_tree.cpp @@ -182,9 +182,13 @@ std::string xml_node::xml_text = ""; std::string const& xml_node::name() const { if (!is_text_) + { return name_; + } else + { return xml_text; + } } std::string const& xml_node::text() const @@ -193,7 +197,8 @@ std::string const& xml_node::text() const { processed_ = true; return name_; - } else + } + else { throw config_error("text() called on non-text node", *this); } @@ -336,7 +341,8 @@ std::string xml_node::get_text() const if (is_text_) { return name_; - } else + } + else { return ""; } @@ -394,10 +400,12 @@ compile_get_opt_attr(label_placement_e); 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(halo_rasterizer_e); compile_get_opt_attr(expression_ptr); compile_get_attr(std::string); compile_get_attr(filter_mode_e); compile_get_attr(point_placement_e); +compile_get_attr(debug_symbolizer_mode_e); compile_get_attr(marker_placement_e); compile_get_attr(marker_multi_policy_e); compile_get_attr(pattern_alignment_e); diff --git a/tests/cpp_tests/agg_blend_src_over_test.cpp b/tests/cpp_tests/agg_blend_src_over_test.cpp index 2679e3b94..7fbcb18a6 100644 --- a/tests/cpp_tests/agg_blend_src_over_test.cpp +++ b/tests/cpp_tests/agg_blend_src_over_test.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "agg_color_rgba.h" #include "agg_pixfmt_rgba.h" #include "agg_rendering_buffer.h" @@ -37,9 +39,9 @@ color blend(color const& source, color const& dest, unsigned cover=255) 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, + 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); @@ -78,7 +80,7 @@ color normal_blend(color const& source, color const& dest, unsigned cover=255) 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); @@ -110,8 +112,8 @@ template struct comp_op_rgba_src_over2 // 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) + unsigned sr, unsigned sg, unsigned sb, + unsigned sa, unsigned cover) { if(cover < 255) { @@ -130,18 +132,25 @@ template struct comp_op_rgba_src_over2 } -int main( int, char*[] ) +int main(int argc, char** argv) { + std::vector args; + for (int i=1;i source_over_old_agg; typedef agg::comp_op_rgba_src_over source_over; - + color white(255,255,255,255); color black(0,0,0,255); BOOST_TEST_EQ( to_string(blend(white,white)), to_string(white) ); BOOST_TEST_EQ( to_string(blend(white,black)), to_string(white) ); BOOST_TEST_EQ( to_string(blend(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 @@ -153,26 +162,26 @@ int main( int, char*[] ) // 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,dest,cover)), expected_str ); - BOOST_TEST_EQ( to_string(blend(source,dest,cover)), expected_str ); + 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,dest,cover)), expected_str ); + BOOST_TEST_EQ( to_string(blend(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,dest,cover)), expected_str ); - BOOST_TEST_EQ( to_string(blend(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,dest,cover)), expected_str ); + BOOST_TEST_EQ( to_string(blend(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); @@ -180,9 +189,9 @@ int main( int, char*[] ) std::string expected_str = to_string(normal_blend(source,dest,cover)); BOOST_TEST_EQ( to_string(blend(source,dest,cover)), expected_str ); BOOST_TEST_EQ( to_string(blend(source,dest,cover)), expected_str ); - } + } - { + { // fails, why? color source(128,128,128,128); color dest(128,128,128,128); @@ -190,11 +199,12 @@ int main( int, char*[] ) std::string expected_str = to_string(normal_blend(source,dest,cover)); BOOST_TEST_EQ( to_string(blend(source,dest,cover)), expected_str ); BOOST_TEST_EQ( to_string(blend(source,dest,cover)), expected_str ); - } + } */ - + if (!::boost::detail::test_errors()) { - std::clog << "C++ AGG blending: \x1b[1;32m✓ \x1b[0m\n"; + if (quiet) std::clog << "\x1b[1;32m.\x1b[0m"; + else std::clog << "C++ AGG blending: \x1b[1;32m✓ \x1b[0m\n"; #if BOOST_VERSION >= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/build.py b/tests/cpp_tests/build.py index 93e7b25ca..9e1315136 100644 --- a/tests/cpp_tests/build.py +++ b/tests/cpp_tests/build.py @@ -6,32 +6,43 @@ Import ('env') test_env = env.Clone() -test_env['LIBS'] = copy(env['LIBMAPNIK_LIBS']) -test_env.AppendUnique(LIBS='mapnik') -test_env.AppendUnique(LIBS='sqlite3') -test_env.AppendUnique(CXXFLAGS='-g') - -for cpp_test in glob.glob('*_test.cpp'): - name = cpp_test.replace('.cpp','-bin') - source_files = [cpp_test] - test_program = None - if 'agg_blend_src_over_test' in cpp_test: - # 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, LINKFLAGS=env['CUSTOM_LDFLAGS']) - 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, LINKFLAGS=env['CUSTOM_LDFLAGS']) - 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) +if not env['CPP_TESTS']: + for cpp_test_bin in glob.glob('*-bin'): + os.unlink(cpp_test_bin) +else: + test_env['LIBS'] = ['mapnik'] + 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, LINKFLAGS=env['CUSTOM_LDFLAGS']) + 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, LINKFLAGS=env['CUSTOM_LDFLAGS']) + 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 new file mode 100644 index 000000000..6e6c6ca6e --- /dev/null +++ b/tests/cpp_tests/clipping_test.cpp @@ -0,0 +1,136 @@ + +// mapnik +#include +#include + +// boost +#include +#include +#include + +// stl +#include +#include +#include +#include +#include + +// 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 +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 const& bbox, + mapnik::geometry_type & geom) +{ + typedef agg::conv_clip_polyline line_clipper; + 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 vertices; + boost::split(vertices, geom_string, boost::is_any_of(",")); + BOOST_FOREACH(std::string const& vert, vertices) + { + std::vector 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 args; + for (int i=1;i parts; + boost::split(parts, csv_line, boost::is_any_of(";")); + // first part is clipping box + mapnik::box2d 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),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"; +#if BOOST_VERSION >= 104600 + ::boost::detail::report_errors_remind().called_report_errors_function = true; +#endif + } + else + { + return ::boost::report_errors(); + } +} diff --git a/tests/cpp_tests/conversions_test.cpp b/tests/cpp_tests/conversions_test.cpp index bdb9d102c..687f2ba4a 100644 --- a/tests/cpp_tests/conversions_test.cpp +++ b/tests/cpp_tests/conversions_test.cpp @@ -3,73 +3,84 @@ #include #include #include +#include +#include -int main( int, char*[] ) +#if defined(_MSC_VER) +#include +#endif + +int main(int argc, char** argv) { + #if defined(_MSC_VER) + unsigned int old = _set_output_format(_TWO_DIGIT_EXPONENT); + #endif + std::vector args; + for (int i=1;i= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/csv_parse_test.cpp b/tests/cpp_tests/csv_parse_test.cpp deleted file mode 100644 index edd0835d9..000000000 --- a/tests/cpp_tests/csv_parse_test.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include "plugins/input/csv/csv_datasource.hpp" -#include - - -int main( int, char*[] ) -{ - // test of directly instanciating a datasource - try { - mapnik::parameters params; - params["type"]="csv"; - params["file"]="./tests/data/csv/wkt.csv"; - csv_datasource ds(params); - BOOST_TEST(true); - } catch (std::exception const& ex) { - BOOST_TEST(false); - std::clog << "threw: " << ex.what() << "\n"; - } - - if (!::boost::detail::test_errors()) { - std::clog << "C++ CSV parse: \x1b[1;32m✓ \x1b[0m\n"; -#if BOOST_VERSION >= 104600 - ::boost::detail::report_errors_remind().called_report_errors_function = true; -#endif - } else { - return ::boost::report_errors(); - } -} diff --git a/tests/cpp_tests/data/blank.jpg b/tests/cpp_tests/data/blank.jpg new file mode 100644 index 000000000..e69de29bb diff --git a/tests/cpp_tests/data/blank.png b/tests/cpp_tests/data/blank.png new file mode 100644 index 000000000..e69de29bb diff --git a/tests/cpp_tests/data/blank.tiff b/tests/cpp_tests/data/blank.tiff new file mode 100644 index 000000000..e69de29bb diff --git a/tests/cpp_tests/data/blank.webp b/tests/cpp_tests/data/blank.webp new file mode 100644 index 000000000..e69de29bb diff --git a/tests/cpp_tests/data/cases.txt b/tests/cpp_tests/data/cases.txt new file mode 100644 index 000000000..6ba17a96d --- /dev/null +++ b/tests/cpp_tests/data/cases.txt @@ -0,0 +1,9 @@ +# testcase format is: +# ;; +# SEG_END=0 SEG_MOVETO = 1 SEG_LINETO = 2 SEG_CLOSE = (0x40 | 0x0f) +50,50,150,150;0 0 1,200 200 2;50 50 1,150 150 2 +50,50,150,150;50 50 1,150 50 2,150 150 2,50 150 2,50 50 2;50 50 1,150 50 2,150 150 2,50 150 2,50 50 2 +# points are dropped by line clipper +50,50,150,150;75 75 1; +# TODO - should the close path be kept after clipping? +# 50,50,150,150;50 50 1,150 50 2,150 150 2,50 150 2,50 50 2,0 0 79;50 50 1,150 50 2,150 150 2,50 150 2,50 50 2 diff --git a/tests/cpp_tests/exceptions_test.cpp b/tests/cpp_tests/exceptions_test.cpp index 0ad8e6c0f..9205a93ae 100644 --- a/tests/cpp_tests/exceptions_test.cpp +++ b/tests/cpp_tests/exceptions_test.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -19,14 +18,23 @@ #include #include #include +#include +#include +#include -extern "C" { -#include -} +#include "utils.hpp" -int main( int, char*[] ) +int main(int argc, char** argv) { + std::vector args; + for (int i=1;i= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/font_registration_test.cpp b/tests/cpp_tests/font_registration_test.cpp index 41908c21d..93a9d5854 100644 --- a/tests/cpp_tests/font_registration_test.cpp +++ b/tests/cpp_tests/font_registration_test.cpp @@ -1,21 +1,36 @@ -#include -#include -namespace fs = boost::filesystem; -using fs::path; -namespace sys = boost::system; - -#include -#include #include +#include +#include -int main( int, char*[] ) +#include +#include + +#include +#include +#include + +#include "utils.hpp" + +int main(int argc, char** argv) { + std::vector args; + for (int i=1;i face_names; @@ -80,7 +95,8 @@ int main( int, char*[] ) } if (!::boost::detail::test_errors()) { - std::clog << "C++ fonts registration: \x1b[1;32m✓ \x1b[0m\n"; + if (quiet) std::clog << "\x1b[1;32m.\x1b[0m"; + else std::clog << "C++ fonts registration: \x1b[1;32m✓ \x1b[0m\n"; #if BOOST_VERSION >= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/fontset_runtime_test.cpp b/tests/cpp_tests/fontset_runtime_test.cpp index f4d7c8b75..f6e351f93 100644 --- a/tests/cpp_tests/fontset_runtime_test.cpp +++ b/tests/cpp_tests/fontset_runtime_test.cpp @@ -17,51 +17,63 @@ #include #include #include +#include +#include +#include "utils.hpp" -int main( int, char*[] ) +int main(int argc, char** argv) { - // 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 = boost::make_shared(); - ctx->push("name"); - mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1)); - mapnik::transcoder tr("utf-8"); - UnicodeString ustr = tr.transcode("hello world!"); - feature->put("name",ustr); - mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::Point); - pt->move_to(128,128); - feature->add_geometry(pt); - mapnik::datasource_ptr memory_ds = boost::make_shared(); - mapnik::memory_datasource *cache = dynamic_cast(memory_ds.get()); - cache->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(memory_ds); - lyr.add_style("style"); - m.addLayer(lyr); - mapnik::feature_type_style the_style; - mapnik::rule the_rule; - mapnik::text_symbolizer text_sym(mapnik::parse_expression("[name]"),10,mapnik::color(0,0,0)); - text_sym.set_fontset(fontset); - the_rule.append(text_sym); - the_style.add_rule(the_rule); - m.insert_style("style",the_style ); - m.zoom_to_box(mapnik::box2d(-256,-256, - 256,256)); - mapnik::image_32 buf(m.width(),m.height()); - mapnik::agg_renderer ren(m,buf); + std::vector args; + for (int i=1;i(); + ctx->push("name"); + mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1)); + mapnik::transcoder tr("utf-8"); + UnicodeString ustr = tr.transcode("hello world!"); + feature->put("name",ustr); + mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::Point); + pt->move_to(128,128); + feature->add_geometry(pt); + boost::shared_ptr ds = boost::make_shared(); + 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.addLayer(lyr); + mapnik::feature_type_style the_style; + mapnik::rule the_rule; + mapnik::text_symbolizer text_sym(mapnik::parse_expression("[name]"),10,mapnik::color(0,0,0)); + text_sym.set_fontset(fontset); + the_rule.append(text_sym); + the_style.add_rule(the_rule); + m.insert_style("style",the_style ); + m.zoom_to_box(mapnik::box2d(-256,-256, + 256,256)); + mapnik::image_32 buf(m.width(),m.height()); + mapnik::agg_renderer ren(m,buf); ren.apply(); } catch (std::exception const& ex) { BOOST_TEST_EQ(std::string(ex.what()),std::string("No valid font face could be loaded for font set: 'fontset'")); } if (!::boost::detail::test_errors()) { - std::clog << "C++ fontset runtime: \x1b[1;32m✓ \x1b[0m\n"; + if (quiet) std::clog << "\x1b[1;32m.\x1b[0m"; + else std::clog << "C++ fontset runtime: \x1b[1;32m✓ \x1b[0m\n"; #if BOOST_VERSION >= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/geometry_converters_test.cpp b/tests/cpp_tests/geometry_converters_test.cpp index b624676da..2444371cd 100644 --- a/tests/cpp_tests/geometry_converters_test.cpp +++ b/tests/cpp_tests/geometry_converters_test.cpp @@ -1,5 +1,11 @@ #include +#include +#include +#include +#include +#include "utils.hpp" +#if BOOST_VERSION >= 104700 #include #include #include @@ -8,15 +14,12 @@ #include #include #include - -#if BOOST_VERSION >= 104700 #include #include #include -#endif -#include -#include +// stl +#include struct output_geometry_backend { @@ -57,7 +60,7 @@ boost::optional linestring_bbox_clipping(mapnik::box2d bbox typedef boost::mpl::vector conv_types; vertex_converter, output_geometry_backend, line_symbolizer, - CoordTransform, proj_transform, agg::trans_affine, conv_types> + CoordTransform, proj_transform, agg::trans_affine, conv_types> converter(bbox, backend, sym, t, prj_trans, tr, 1.0); converter.set(); @@ -97,7 +100,7 @@ boost::optional polygon_bbox_clipping(mapnik::box2d bbox, typedef boost::mpl::vector conv_types; vertex_converter, output_geometry_backend, polygon_symbolizer, - CoordTransform, proj_transform, agg::trans_affine, conv_types> + CoordTransform, proj_transform, agg::trans_affine, conv_types> converter(bbox, backend, sym, t, prj_trans, tr, 1.0); converter.set(); @@ -121,9 +124,21 @@ boost::optional polygon_bbox_clipping(mapnik::box2d bbox, return boost::optional(); } +#endif -int main( int, char*[] ) +int main(int argc, char** argv) { + std::vector args; + for (int i=1;i= 104700 + // LineString/bbox clipping { std::string wkt_in("LineString(0 0,200 200)"); @@ -154,17 +169,20 @@ int main( int, char*[] ) BOOST_TEST(result); BOOST_TEST_EQ(*result, std::string("GeometryCollection EMPTY")); } -#endif { std::string wkt_in("Polygon((0 0,100 200,200 0,0 0 ))"); boost::optional result = polygon_bbox_clipping(mapnik::box2d(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 + +#endif if (!::boost::detail::test_errors()) { - std::clog << "C++ geometry conversions: \x1b[1;32m✓ \x1b[0m\n"; + if (quiet) std::clog << "\x1b[1;32m.\x1b[0m"; + else std::clog << "C++ geometry conversions: \x1b[1;32m✓ \x1b[0m\n"; #if BOOST_VERSION >= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/image_io_test.cpp b/tests/cpp_tests/image_io_test.cpp new file mode 100644 index 000000000..549378ba4 --- /dev/null +++ b/tests/cpp_tests/image_io_test.cpp @@ -0,0 +1,114 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "utils.hpp" + +int main(int argc, char** argv) +{ + std::vector args; + for (int i=1;i type; + try + { + BOOST_TEST(set_working_dir(args)); + + 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::auto_ptr reader(mapnik::get_image_reader(should_throw,*type)); + if (reader.get()) BOOST_TEST( false ); + } + catch (std::exception const&) + { + BOOST_TEST( true ); + } + + 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::auto_ptr reader(mapnik::get_image_reader(should_throw,*type)); + if (reader.get()) BOOST_TEST( false ); + } + catch (std::exception const&) + { + BOOST_TEST( true ); + } + + 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::auto_ptr reader(mapnik::get_image_reader(should_throw,*type)); + if (reader.get()) BOOST_TEST( false ); + } + catch (std::exception const&) + { + BOOST_TEST( true ); + } + + 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::auto_ptr 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::auto_ptr reader(mapnik::get_image_reader(should_throw,*type)); + if (reader.get()) BOOST_TEST( false ); + } + catch (std::exception const&) + { + BOOST_TEST( true ); + } + + } + catch (std::exception const & ex) + { + std::clog << "C++ image i/o problem: " << 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"; +#if BOOST_VERSION >= 104600 + ::boost::detail::report_errors_remind().called_report_errors_function = true; +#endif + } else { + return ::boost::report_errors(); + } +} diff --git a/tests/cpp_tests/label_algo_test.cpp b/tests/cpp_tests/label_algo_test.cpp index cf7a0d414..d997d19b9 100644 --- a/tests/cpp_tests/label_algo_test.cpp +++ b/tests/cpp_tests/label_algo_test.cpp @@ -3,10 +3,18 @@ #include #include #include +#include +#include - -int main( int, char*[] ) +int main(int argc, char** argv) { + std::vector args; + for (int i=1;i= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif diff --git a/tests/cpp_tests/map_request_test.cpp b/tests/cpp_tests/map_request_test.cpp new file mode 100644 index 000000000..fabfd34ab --- /dev/null +++ b/tests/cpp_tests/map_request_test.cpp @@ -0,0 +1,170 @@ +#include +#include + +#include +#include +#include +#include +#if defined(HAVE_CAIRO) +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.hpp" + +bool compare_images(std::string const& src_fn,std::string const& dest_fn) +{ + using namespace mapnik; + std::auto_ptr reader1(mapnik::get_image_reader(dest_fn,"png")); + if (!reader1.get()) + { + throw mapnik::image_reader_exception("Failed to load: " + dest_fn); + } + boost::shared_ptr image_ptr1 = boost::make_shared(reader1->width(),reader1->height()); + reader1->read(0,0,image_ptr1->data()); + + std::auto_ptr reader2(mapnik::get_image_reader(src_fn,"png")); + if (!reader2.get()) + { + throw mapnik::image_reader_exception("Failed to load: " + src_fn); + } + boost::shared_ptr image_ptr2 = boost::make_shared(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 args; + for (int i=1;i 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 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 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; + BOOST_FOREACH ( mapnik::layer const& lyr, m.layers() ) + { + if (lyr.visible(scale_denom)) + { + std::set 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 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"; +#if BOOST_VERSION >= 104600 + ::boost::detail::report_errors_remind().called_report_errors_function = true; +#endif + } else { + return ::boost::report_errors(); + } +} diff --git a/tests/cpp_tests/params_test.cpp b/tests/cpp_tests/params_test.cpp index fe2e717dd..a02e546e9 100644 --- a/tests/cpp_tests/params_test.cpp +++ b/tests/cpp_tests/params_test.cpp @@ -4,11 +4,18 @@ #include #include #include - +#include +#include #include -int main( int, char*[] ) +int main(int argc, char** argv) { + std::vector args; + for (int i=1;i("null")/* && *params.get("null") == mapnik::value_null()*/) ); if (!::boost::detail::test_errors()) { - std::clog << "C++ parameters: \x1b[1;32m✓ \x1b[0m\n"; + if (quiet) std::clog << "\x1b[1;32m.\x1b[0m"; + else std::clog << "C++ parameters: \x1b[1;32m✓ \x1b[0m\n"; #if BOOST_VERSION >= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif 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 new file mode 100644 index 000000000..cb8e47826 Binary files /dev/null and b/tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png 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 new file mode 100644 index 000000000..9de752a29 Binary files /dev/null and b/tests/cpp_tests/support/map-request-marker-text-line-expected.png differ diff --git a/tests/cpp_tests/utils.hpp b/tests/cpp_tests/utils.hpp new file mode 100644 index 000000000..e82281635 --- /dev/null +++ b/tests/cpp_tests/utils.hpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include + +inline static bool set_working_dir(std::vector args) +{ + std::vector::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 new file mode 100644 index 000000000..231388c69 --- /dev/null +++ b/tests/cpp_tests/wkb_formats_test.cpp @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int main(int argc, char** argv) +{ + std::vector args; + for (int i=1;ipaths(), + (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++ CSV parse: \x1b[1;32m✓ \x1b[0m\n"; +#if BOOST_VERSION >= 104600 + ::boost::detail::report_errors_remind().called_report_errors_function = true; +#endif + } else { + return ::boost::report_errors(); + } +} diff --git a/tests/data/broken_maps/invalid_layer_srs.xml b/tests/data/broken_maps/invalid_layer_srs.xml new file mode 100644 index 000000000..2fbc25fc8 --- /dev/null +++ b/tests/data/broken_maps/invalid_layer_srs.xml @@ -0,0 +1,3 @@ + + + \ 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 new file mode 100644 index 000000000..16dbf335d --- /dev/null +++ b/tests/data/broken_maps/invalid_map_srs.xml @@ -0,0 +1,2 @@ + + \ 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 index c68a16ee6..ca0e18589 100644 --- a/tests/data/broken_maps/text_symbolizer_broken.xml +++ b/tests/data/broken_maps/text_symbolizer_broken.xml @@ -2,7 +2,7 @@ \ 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 index bb77ae8d0..0616e3d2a 100644 --- a/tests/data/good_maps/also_and_else_filter.xml +++ b/tests/data/good_maps/also_and_else_filter.xml @@ -1,17 +1,17 @@ - + diff --git a/tests/data/good_maps/bool_values.xml b/tests/data/good_maps/bool_values.xml index 056acbc49..5e4742dba 100644 --- a/tests/data/good_maps/bool_values.xml +++ b/tests/data/good_maps/bool_values.xml @@ -1,43 +1,43 @@ - + \ No newline at end of file diff --git a/tests/data/good_maps/line_symbolizer.xml b/tests/data/good_maps/line_symbolizer.xml index d58791861..7a4944aea 100644 --- a/tests/data/good_maps/line_symbolizer.xml +++ b/tests/data/good_maps/line_symbolizer.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/data/good_maps/marker-text-line.xml b/tests/data/good_maps/marker-text-line.xml index 6c43cf53c..776a87341 100644 --- a/tests/data/good_maps/marker-text-line.xml +++ b/tests/data/good_maps/marker-text-line.xml @@ -1,4 +1,4 @@ - + - - - meta_point_bboxs - - ogr - OGRGeoJSON - ../../../markers.json - - ---> \ 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 index 107467c70..d4b63a98a 100644 --- a/tests/data/good_maps/markers_symbolizer_points_file.xml +++ b/tests/data/good_maps/markers_symbolizer_points_file.xml @@ -14,20 +14,4 @@ point - \ No newline at end of file diff --git a/tests/data/good_maps/paths_relative_to_script.xml b/tests/data/good_maps/paths_relative_to_script.xml deleted file mode 100644 index b096f3fc4..000000000 --- a/tests/data/good_maps/paths_relative_to_script.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - ../data/shp/poly.shp - shape - - - - \ No newline at end of file diff --git a/tests/data/good_maps/paths_relative_to_xml.xml b/tests/data/good_maps/paths_relative_to_xml.xml index 6c63bd1d9..2a3d4b7c9 100644 --- a/tests/data/good_maps/paths_relative_to_xml.xml +++ b/tests/data/good_maps/paths_relative_to_xml.xml @@ -1,7 +1,7 @@ - + ../shp/poly.shp shape diff --git a/tests/data/good_maps/point_json.xml b/tests/data/good_maps/point_json.xml index 1e9146dc4..aa2efd141 100644 --- a/tests/data/good_maps/point_json.xml +++ b/tests/data/good_maps/point_json.xml @@ -22,7 +22,7 @@ 1 - ../json/points.json + ../json/points.geojson 0 ogr diff --git a/tests/data/good_maps/shield_symbolizer.xml b/tests/data/good_maps/shield_symbolizer.xml index 51882658e..716875c24 100644 --- a/tests/data/good_maps/shield_symbolizer.xml +++ b/tests/data/good_maps/shield_symbolizer.xml @@ -20,7 +20,7 @@ 2 - ../json/lines.json + ../json/lines.geojson 0 ogr @@ -29,7 +29,7 @@ 1 - ../json/points.json + ../json/points.geojson 0 ogr diff --git a/tests/data/images/xcode-CgBI.png b/tests/data/images/xcode-CgBI.png new file mode 100644 index 000000000..243d9188a Binary files /dev/null and b/tests/data/images/xcode-CgBI.png differ diff --git a/tests/data/json/escaped.json b/tests/data/json/escaped.geojson similarity index 100% rename from tests/data/json/escaped.json rename to tests/data/json/escaped.geojson diff --git a/tests/data/json/lines.json b/tests/data/json/lines.geojson similarity index 95% rename from tests/data/json/lines.json rename to tests/data/json/lines.geojson index f3babc9cf..34e9bae27 100644 --- a/tests/data/json/lines.json +++ b/tests/data/json/lines.geojson @@ -2,8 +2,6 @@ "type": "FeatureCollection", -/* comment */ - "features": [ { "type": "Feature", @@ -15,7 +13,7 @@ "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.json b/tests/data/json/null_feature.geojson similarity index 100% rename from tests/data/json/null_feature.json rename to tests/data/json/null_feature.geojson diff --git a/tests/data/json/points.json b/tests/data/json/points.geojson similarity index 97% rename from tests/data/json/points.json rename to tests/data/json/points.geojson index 8b1116008..36dc8597c 100644 --- a/tests/data/json/points.json +++ b/tests/data/json/points.geojson @@ -2,8 +2,6 @@ "type": "FeatureCollection", -/* comment */ - "features": [ { "type": "Feature", @@ -30,7 +28,7 @@ "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/pngsuite/xcsn0g01.png b/tests/data/pngsuite/xcsn0g01.png deleted file mode 100644 index 9863a262c..000000000 Binary files a/tests/data/pngsuite/xcsn0g01.png and /dev/null differ diff --git a/tests/data/pngsuite/xhdn0g08.png b/tests/data/pngsuite/xhdn0g08.png deleted file mode 100644 index fcb8737fa..000000000 Binary files a/tests/data/pngsuite/xhdn0g08.png and /dev/null differ diff --git a/demo/data/test/charplacement.dbf b/tests/data/shp/charplacement.dbf similarity index 100% rename from demo/data/test/charplacement.dbf rename to tests/data/shp/charplacement.dbf diff --git a/demo/data/test/charplacement.shp b/tests/data/shp/charplacement.shp similarity index 100% rename from demo/data/test/charplacement.shp rename to tests/data/shp/charplacement.shp diff --git a/demo/data/test/charplacement.shx b/tests/data/shp/charplacement.shx similarity index 100% rename from demo/data/test/charplacement.shx rename to tests/data/shp/charplacement.shx diff --git a/demo/data/test/displacement.dbf b/tests/data/shp/displacement.dbf similarity index 100% rename from demo/data/test/displacement.dbf rename to tests/data/shp/displacement.dbf diff --git a/demo/data/test/displacement.shp b/tests/data/shp/displacement.shp similarity index 100% rename from demo/data/test/displacement.shp rename to tests/data/shp/displacement.shp diff --git a/demo/data/test/displacement.shx b/tests/data/shp/displacement.shx similarity index 100% rename from demo/data/test/displacement.shx rename to tests/data/shp/displacement.shx diff --git a/demo/data/test/overlap.dbf b/tests/data/shp/overlap.dbf similarity index 100% rename from demo/data/test/overlap.dbf rename to tests/data/shp/overlap.dbf diff --git a/demo/data/test/overlap.shp b/tests/data/shp/overlap.shp similarity index 100% rename from demo/data/test/overlap.shp rename to tests/data/shp/overlap.shp diff --git a/demo/data/test/overlap.shx b/tests/data/shp/overlap.shx similarity index 100% rename from demo/data/test/overlap.shx rename to tests/data/shp/overlap.shx diff --git a/tests/data/shp/points/poi.xml b/tests/data/shp/points/poi.xml deleted file mode 100644 index f4f2b0b7c..000000000 --- a/tests/data/shp/points/poi.xml +++ /dev/null @@ -1 +0,0 @@ -20120921162140001.0FALSEpoi0020.000file://\\ba-projectman\drawings\GIS\gis_data\shapefiles\TileMill\poi.shpLocal Area NetworkProjectedGCS_North_American_1983_HARNLinear Unit: Foot_US (0.304801)NAD_1983_HARN_StatePlane_North_Carolina_FIPS_3200_Feet<ProjectedCoordinateSystem xsi:type='typens:ProjectedCoordinateSystem' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://www.esri.com/schemas/ArcGIS/10.1'><WKT>PROJCS[&quot;NAD_1983_HARN_StatePlane_North_Carolina_FIPS_3200_Feet&quot;,GEOGCS[&quot;GCS_North_American_1983_HARN&quot;,DATUM[&quot;D_North_American_1983_HARN&quot;,SPHEROID[&quot;GRS_1980&quot;,6378137.0,298.257222101]],PRIMEM[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433]],PROJECTION[&quot;Lambert_Conformal_Conic&quot;],PARAMETER[&quot;False_Easting&quot;,2000000.0],PARAMETER[&quot;False_Northing&quot;,0.0],PARAMETER[&quot;Central_Meridian&quot;,-79.0],PARAMETER[&quot;Standard_Parallel_1&quot;,34.33333333333334],PARAMETER[&quot;Standard_Parallel_2&quot;,36.16666666666666],PARAMETER[&quot;Latitude_Of_Origin&quot;,33.75],UNIT[&quot;Foot_US&quot;,0.3048006096012192],AUTHORITY[&quot;EPSG&quot;,3404]]</WKT><XOrigin>-121841900</XOrigin><YOrigin>-93659000</YOrigin><XYScale>36365718.124241434</XYScale><ZOrigin>-100000</ZOrigin><ZScale>10000</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>0.0032808333333333331</XYTolerance><ZTolerance>0.001</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision><WKID>3359</WKID><LatestWKID>3404</LatestWKID></ProjectedCoordinateSystem>FeatureClassToFeatureClass Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point Z:\GIS\gis_data\shapefiles\TileMill poi.shp # "interst_id "PKInterstID" true true true 20 Text 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,interst_id,-1,-1;state_d "StateDOM" true true false 16 Text 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,state_d,-1,-1;cnty_name "CntyName" true true false 50 Text 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,cnty_name,-1,-1;latitude "Latitude" true true false 8 Double 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,latitude,-1,-1;longitude "Longitude" true true false 8 Double 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,longitude,-1,-1;Name "Name" true true false 50 Text 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,Name,-1,-1;Website "Website" true true false 100 Text 0 0 ,First,#,Z:\GIS\gis_data\geodatabase\working\UNCW_GIS.gdb\land_status\main_campus_interest_point,Website,-1,-1" #20121204105923002012120410592300Microsoft Windows 7 Version 6.1 (Build 7600) ; Esri ArcGIS 10.1.1.3143poiShapefile0.000datasetEPSG7.11.20SimpleFALSE0FALSETRUEpoiFeature Class0FIDFIDOID400Internal feature number.EsriSequential unique whole numbers that are automatically generated.ShapeShapeGeometry000Feature geometry.EsriCoordinates defining the features.interst_idinterst_idString2000state_dstate_dString1600cnty_namecnty_nameString5000latitudelatitudeDouble1900longitudelongitudeDouble1900NameNameString5000WebsiteWebsiteString1000020121204 diff --git a/demo/data/test/textspacing.dbf b/tests/data/shp/textspacing.dbf similarity index 100% rename from demo/data/test/textspacing.dbf rename to tests/data/shp/textspacing.dbf diff --git a/demo/data/test/textspacing.shp b/tests/data/shp/textspacing.shp similarity index 100% rename from demo/data/test/textspacing.shp rename to tests/data/shp/textspacing.shp diff --git a/demo/data/test/textspacing.shx b/tests/data/shp/textspacing.shx similarity index 100% rename from demo/data/test/textspacing.shx rename to tests/data/shp/textspacing.shx diff --git a/tests/data/svg/box.svg b/tests/data/svg/box.svg new file mode 100644 index 000000000..a6ddb179a --- /dev/null +++ b/tests/data/svg/box.svg @@ -0,0 +1,25 @@ + + + + + + + + \ 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 new file mode 100644 index 000000000..ac31795a1 --- /dev/null +++ b/tests/data/svg/place-of-worship-24.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/tests/data/svg/rect2.svg b/tests/data/svg/rect2.svg new file mode 100644 index 000000000..37907075f --- /dev/null +++ b/tests/data/svg/rect2.svg @@ -0,0 +1,39 @@ + + + + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/tests/python_tests/box2d_test.py b/tests/python_tests/box2d_test.py index ef7a2f95b..4c00edd77 100644 --- a/tests/python_tests/box2d_test.py +++ b/tests/python_tests/box2d_test.py @@ -3,9 +3,9 @@ import os from nose.tools import * +from utilities import execution_path, run_all import mapnik - def test_coord_init(): c = mapnik.Coord(100, 100) @@ -100,8 +100,34 @@ def test_envelope_static_init(): 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)) @@ -148,5 +174,4 @@ def test_envelope_clipping(): eq_(e1,e2) if __name__ == "__main__": - setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index b508d6628..7a828f8ca 100644 --- a/tests/python_tests/buffer_clear_test.py +++ b/tests/python_tests/buffer_clear_test.py @@ -2,7 +2,7 @@ import sys import os, mapnik from timeit import Timer, time from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all def setup(): # All of the paths used are relative, if we run the tests @@ -45,19 +45,19 @@ def make_map(): m.zoom_all() return m -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 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() - [eval(run)() for run in dir() if 'test_' in run] \ No newline at end of file + run_all(eval(x) for x in dir() if x.startswith("test_")) \ No newline at end of file diff --git a/tests/python_tests/cairo_test.py b/tests/python_tests/cairo_test.py index 309b1cb62..467f17df8 100644 --- a/tests/python_tests/cairo_test.py +++ b/tests/python_tests/cairo_test.py @@ -3,7 +3,7 @@ import os import mapnik from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all def setup(): # All of the paths used are relative, if we run the tests @@ -60,4 +60,4 @@ if mapnik.has_pycairo() and 'sqlite' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 88d610746..8d91e9569 100644 --- a/tests/python_tests/compositing_test.py +++ b/tests/python_tests/compositing_test.py @@ -254,8 +254,8 @@ def test_background_image_with_alpha_and_background_color_against_composited_con im1.demultiply() # compare image rendered (compositing in `agg_renderer::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)) + #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() diff --git a/tests/python_tests/csv_test.py b/tests/python_tests/csv_test.py index e691b24bd..75cce7df8 100644 --- a/tests/python_tests/csv_test.py +++ b/tests/python_tests/csv_test.py @@ -7,14 +7,19 @@ from nose.tools import * from utilities import execution_path import os, mapnik -# make the tests silent since we intentially test error conditions that are noisy -mapnik.logger.set_severity(mapnik.severity_type.None) + +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): @@ -535,7 +540,6 @@ if 'csv' in mapnik.DatasourceCache.plugin_names(): feat = fs.next() eq_(feat['bigint'],2147483648) feat = fs.next() - eq_(feat['bigint'],sys.maxint) eq_(feat['bigint'],9223372036854775807) eq_(feat['bigint'],0x7FFFFFFFFFFFFFFF) desc = ds.describe() diff --git a/tests/python_tests/datasource_test.py b/tests/python_tests/datasource_test.py index d11056aaf..22436713e 100644 --- a/tests/python_tests/datasource_test.py +++ b/tests/python_tests/datasource_test.py @@ -1,8 +1,7 @@ #!/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(): @@ -34,7 +33,7 @@ def test_total_feature_count_shp(): def test_total_feature_count_json(): if 'ogr' in mapnik.DatasourceCache.plugin_names(): - ds = mapnik.Ogr(file='../data/json/points.json',layer_by_index=0) + 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') @@ -57,7 +56,7 @@ def test_sqlite_reading(): eq_(num_feats, 245) def test_reading_json_from_string(): - json = open('../data/json/points.json','r').read() + 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() @@ -126,4 +125,4 @@ def test_hit_grid(): if __name__ == '__main__': setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 0354d8422..d27f6e578 100644 --- a/tests/python_tests/datasource_xml_template_test.py +++ b/tests/python_tests/datasource_xml_template_test.py @@ -3,7 +3,7 @@ import os from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all import mapnik def setup(): @@ -21,4 +21,4 @@ def test_datasource_template_is_working(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 06ffb97c9..2a5f80e17 100644 --- a/tests/python_tests/extra_map_props_test.py +++ b/tests/python_tests/extra_map_props_test.py @@ -2,12 +2,8 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path -from Queue import Queue -import threading - +from utilities import execution_path, run_all import os, mapnik -import sqlite3 def setup(): # All of the paths used are relative, if we run the tests @@ -38,4 +34,4 @@ def test_serializing_arbitrary_parameters(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index e601dd4c5..2f0856cef 100644 --- a/tests/python_tests/feature_id_test.py +++ b/tests/python_tests/feature_id_test.py @@ -1,9 +1,7 @@ #!/usr/bin/env python from nose.tools import * - -from utilities import execution_path, Todo - +from utilities import execution_path, run_all import os, sys, glob, mapnik import itertools @@ -48,20 +46,21 @@ def test_shapefile_polygon_feature_query_id(): compare_shape_between_mapnik_and_ogr('../data/shp/world_merc.shp',query) def test_feature_hit_count(): - raise Todo("need to optimize multigeom bbox handling in shapeindex: https://github.com/mapnik/mapnik/issues/783") + 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)) + #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() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 7de725fd8..c40665ce6 100644 --- a/tests/python_tests/feature_test.py +++ b/tests/python_tests/feature_test.py @@ -3,6 +3,7 @@ import itertools import unittest from nose.tools import * +from utilities import execution_path, run_all import mapnik from binascii import unhexlify @@ -89,4 +90,4 @@ def test_feature_expression_evaluation_attr_with_spaces(): eq_(expr.evaluate(f),True) if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index 6a6200f39..31fb02969 100644 --- a/tests/python_tests/filter_test.py +++ b/tests/python_tests/filter_test.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * +from utilities import run_all import mapnik if hasattr(mapnik,'Expression'): @@ -215,33 +216,35 @@ def test_creation_of_bool(): f["bool"] = True eq_(f["bool"],True) # TODO - will become int of 1 do to built in boost python conversion - # is this fixable? - eq_(isinstance(f["bool"],bool) or isinstance(f["bool"],int),True) + # 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"],int),True) + 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"],int),False) + 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], - [0,False,int], - [123,False,int], + [u'',False,unicode], + [0,False,long], + [123,False,long], [0.0,False,float], [123.123,False,float], [.1,False,float], - [False,False,int], # TODO - should become bool - [True,False,int], # TODO - should become bool + [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,int], - [922337203685477580,False,int] + [2147483648,False,long], + [922337203685477580,False,long] ] def test_expressions_with_null_equality(): @@ -280,16 +283,16 @@ def test_expressions_with_null_equality2(): truthyness = [ [u'hello',True,unicode], [u'',False,unicode], - [0,False,int], - [123,True,int], + [0,False,long], + [123,True,long], [0.0,False,float], [123.123,True,float], [.1,True,float], - [False,False,int], # TODO - should become bool - [True,True,int], # TODO - should become bool + [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,int], - [922337203685477580,True,int] + [2147483648,True,long], + [922337203685477580,True,long] ] def test_expressions_for_thruthyness(): @@ -317,5 +320,117 @@ def test_expressions_for_thruthyness(): 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) + + if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index f9249b247..97845e740 100644 --- a/tests/python_tests/font_test.py +++ b/tests/python_tests/font_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from nose.tools import * - +from utilities import execution_path, run_all import mapnik # Tests that exercise fonts. @@ -13,4 +13,4 @@ import mapnik # ts = mapnik.TextSymbolizer('Name', 'Invalid Font Name', int(8), mapnik.Color('black')) if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index 4db8ca73c..f7879955b 100644 --- a/tests/python_tests/fontset_test.py +++ b/tests/python_tests/fontset_test.py @@ -2,7 +2,7 @@ from nose.tools import * from utilities import execution_path - +from utilities import execution_path, run_all import os, mapnik def setup(): @@ -39,4 +39,4 @@ def test_loading_fontset_from_python(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 6ed844f52..d6143b7b7 100644 --- a/tests/python_tests/geojson_plugin_test.py +++ b/tests/python_tests/geojson_plugin_test.py @@ -2,8 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path - +from utilities import execution_path, run_all import os, mapnik def setup(): @@ -14,7 +13,7 @@ def setup(): if 'geojson' in mapnik.DatasourceCache.plugin_names(): def test_geojson_init(): - ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.json') + 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) @@ -22,7 +21,7 @@ if 'geojson' in mapnik.DatasourceCache.plugin_names(): assert_almost_equal(e.maxy, 41.480573, places=3) def test_geojson_properties(): - ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.json') + ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.geojson') f = ds.features_at_point(s.envelope().center()).features[0] desc = ds.describe() @@ -37,7 +36,7 @@ if 'geojson' in mapnik.DatasourceCache.plugin_names(): eq_(f['NOM_FR'], u'Québec') def test_geojson_properties(): - ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.json') + ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.geojson') f = ds.all_features()[0] desc = ds.describe() @@ -54,7 +53,7 @@ if 'geojson' in mapnik.DatasourceCache.plugin_names(): # @raises(RuntimeError) def test_that_nonexistant_query_field_throws(**kwargs): - ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.json') + 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']) @@ -69,4 +68,4 @@ if 'geojson' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index b6def270d..c5440a449 100644 --- a/tests/python_tests/geometry_io_test.py +++ b/tests/python_tests/geometry_io_test.py @@ -2,8 +2,7 @@ from nose.tools import * import os,sys -from utilities import execution_path -from utilities import Todo +from utilities import execution_path, run_all import mapnik from binascii import unhexlify @@ -195,16 +194,15 @@ def test_geometry_index_error2(): f.geometries()[3] def test_wkt_rounding(): - raise Todo("fixme or remove test") # 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.904185417583761 54.180426336712856,7.89918053477129 54.178168035931542,7.897715691021261 54.182318426556606,7.893565300396205 54.183111883587891,7.89039147227129 54.187567449994106,7.885874870708761 54.190680242962827,7.879893425396261 54.193915106244049,7.894541862896233 54.194647528119134,7.900645378521233 54.190680242962827,7.904185417583761 54.180426336712856))" + 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(): - raise Todo("fixme or remove test") + 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))" + #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 @@ -226,4 +224,4 @@ def test_wkt_collection_flattening(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 737afd855..5b52f4e2e 100644 --- a/tests/python_tests/grayscale_test.py +++ b/tests/python_tests/grayscale_test.py @@ -1,5 +1,6 @@ import mapnik from nose.tools import * +from utilities import execution_path, run_all def test_grayscale_conversion(): im = mapnik.Image(2,2) @@ -9,4 +10,4 @@ def test_grayscale_conversion(): eq_((pixel >> 24) & 0xff,255); if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index a1d0e1cc8..ffe1d3108 100644 --- a/tests/python_tests/image_encoding_speed_test.py +++ b/tests/python_tests/image_encoding_speed_test.py @@ -5,7 +5,7 @@ import sys import os, mapnik from timeit import Timer, time from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all def setup(): # All of the paths used are relative, if we run the tests @@ -122,4 +122,4 @@ def do_encoding(): if __name__ == "__main__": setup() do_encoding() - [eval(run)() for run in dir() if 'test_' in run] + 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 new file mode 100644 index 000000000..f67dc49b2 --- /dev/null +++ b/tests/python_tests/image_test.py @@ -0,0 +1,81 @@ +#!/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() + run_all(eval(x) for x in dir() if x.startswith("test_")) diff --git a/tests/python_tests/images/support/char_placement.png b/tests/python_tests/images/support/char_placement.png new file mode 100644 index 000000000..7abcb6f20 Binary files /dev/null and b/tests/python_tests/images/support/char_placement.png differ diff --git a/tests/python_tests/images/support/displacement.png b/tests/python_tests/images/support/displacement.png new file mode 100644 index 000000000..644aeb6a5 Binary files /dev/null and b/tests/python_tests/images/support/displacement.png differ diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+q=64.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+q=64.webp new file mode 100644 index 000000000..ce65bf5df Binary files /dev/null and b/tests/python_tests/images/support/encoding-opts/blank-webp+q=64.webp 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 new file mode 100644 index 000000000..ce65bf5df Binary files /dev/null and b/tests/python_tests/images/support/encoding-opts/blank-webp.webp differ diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+q=64.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+q=64.webp new file mode 100644 index 000000000..ce65bf5df Binary files /dev/null and b/tests/python_tests/images/support/encoding-opts/solid-webp+q=64.webp 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 new file mode 100644 index 000000000..ce65bf5df Binary files /dev/null and b/tests/python_tests/images/support/encoding-opts/solid-webp.webp differ diff --git a/tests/python_tests/images/support/overlap.png b/tests/python_tests/images/support/overlap.png new file mode 100644 index 000000000..56abfbaa4 Binary files /dev/null and b/tests/python_tests/images/support/overlap.png differ diff --git a/tests/python_tests/images/support/spacing.png b/tests/python_tests/images/support/spacing.png new file mode 100644 index 000000000..8d6bb4026 Binary files /dev/null and b/tests/python_tests/images/support/spacing.png differ diff --git a/tests/python_tests/images/support/transparency/white0.webp b/tests/python_tests/images/support/transparency/white0.webp new file mode 100644 index 000000000..81c926c23 Binary files /dev/null and b/tests/python_tests/images/support/transparency/white0.webp differ diff --git a/tests/python_tests/introspection_test.py b/tests/python_tests/introspection_test.py index ec89b2b98..66665da09 100644 --- a/tests/python_tests/introspection_test.py +++ b/tests/python_tests/introspection_test.py @@ -2,7 +2,7 @@ import os from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all import mapnik @@ -68,4 +68,4 @@ def test_introspect_symbolizers(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 0f27810c3..d2452971c 100644 --- a/tests/python_tests/json_feature_properties_test.py +++ b/tests/python_tests/json_feature_properties_test.py @@ -3,6 +3,7 @@ from nose.tools import * import os,sys import mapnik +from utilities import execution_path, run_all try: import json except ImportError: @@ -99,4 +100,4 @@ def test_char_escaping(): eq_(pyjson['properties']['name'],expected) if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index 5d3a9c06c..164f6ba32 100644 --- a/tests/python_tests/layer_buffer_size_test.py +++ b/tests/python_tests/layer_buffer_size_test.py @@ -1,7 +1,7 @@ #coding=utf8 import os import mapnik -from utilities import execution_path +from utilities import execution_path, run_all from nose.tools import * def setup(): @@ -9,25 +9,27 @@ def setup(): # from another directory we need to chdir() os.chdir(execution_path('.')) -# 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) - expected_im = mapnik.Image.open(expected) - eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected)) +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) + expected_im = mapnik.Image.open(expected) + eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected)) if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 436a92091..ec13fc7ed 100644 --- a/tests/python_tests/layer_modification_test.py +++ b/tests/python_tests/layer_modification_test.py @@ -1,10 +1,8 @@ #!/usr/bin/env python -from nose.tools import * - import os from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all import mapnik def setup(): @@ -74,4 +72,4 @@ def test_adding_datasource_to_layer(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 57119ab9e..a38d2fd6d 100644 --- a/tests/python_tests/layer_test.py +++ b/tests/python_tests/layer_test.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * +from utilities import execution_path, run_all import mapnik # Map initialization @@ -24,4 +25,4 @@ def test_layer_init(): eq_(len(l.styles),0) if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index 03c97437d..f440528ff 100644 --- a/tests/python_tests/load_map_test.py +++ b/tests/python_tests/load_map_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all import os, sys, glob, mapnik @@ -10,50 +10,42 @@ def setup(): # from another directory we need to chdir() os.chdir(execution_path('.')) -# We expect these files to not raise any -# exceptions at all -def assert_loads_successfully(file): - m = mapnik.Map(512, 512) - - try: - strict = True - mapnik.load_map(m, file, strict) - - # libxml2 is not smart about paths, and clips the last directory off - # of a path if it does not end in a trailing slash - base_path = os.path.dirname(file) + '/' - mapnik.load_map_from_string(m,open(file,'rb').read(),strict,base_path) - except RuntimeError, e: - # only test datasources that we have installed - if not 'Could not create datasource' in str(e): - raise RuntimeError(e) - - -# We expect these files to raise a RuntimeError -# and fail if there isn't one (or a different type -# of exception) -@raises(RuntimeError) -def assert_raises_runtime_error(file): - m = mapnik.Map(512, 512) - - strict = True - mapnik.load_map(m, file, strict) - 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") - for file in broken_files: - yield assert_raises_runtime_error, file + 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") - for file in good_files: - yield assert_loads_successfully, file + 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): + failures.append('Failed to load valid map (%s)!' % filename) + eq_(len(failures),0,'\n'+'\n'.join(failures)) if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + run_all(eval(x) for x in dir() if x.startswith("test_")) diff --git a/tests/python_tests/map_deepcopy_test.py b/tests/python_tests/map_deepcopy_test.py index 2caf846c0..d4386b459 100644 --- a/tests/python_tests/map_deepcopy_test.py +++ b/tests/python_tests/map_deepcopy_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all from copy import deepcopy import os, mapnik @@ -40,4 +40,4 @@ def setup(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 713a2022b..f1493a6e3 100644 --- a/tests/python_tests/map_query_test.py +++ b/tests/python_tests/map_query_test.py @@ -1,8 +1,7 @@ #!/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(): @@ -64,7 +63,11 @@ if 'shape' in mapnik.DatasourceCache.plugin_names(): m.zoom_all() #mapnik.render_to_file(m,'works2.png') # validate that aspect_fix_mode modified the bbox reasonably - eq_(str(m.envelope()),str(mapnik.Box2d(-179.999999975,-167.951396161,179.999999975,192.048603789))) + 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') @@ -87,11 +90,15 @@ if 'shape' in mapnik.DatasourceCache.plugin_names(): # caution - will go square due to evil aspect_fix_mode backhandedness m.zoom_all() # validate that aspect_fix_mode modified the bbox reasonably - eq_(str(m.envelope()),str(mapnik.Box2d(-179.999999975,-167.951396161,179.999999975,192.048603789))) + 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() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 5698b3392..8608299d7 100644 --- a/tests/python_tests/mapnik_config_test.py +++ b/tests/python_tests/mapnik_config_test.py @@ -1,35 +1,80 @@ #!/usr/bin/env python from nose.tools import * -from subprocess import call +from utilities import execution_path, run_all +from subprocess import Popen, PIPE, STDOUT import os -#import os, sys, glob, mapnik +import os, sys, glob, mapnik -#def test(): -# # mapnik-config program -# # should be on default path... -# mc = 'mapnik-config' -# valid = ['--help', -# '--prefix', -# '--libs', -# '--dep-libs', -# '--ldflags', -# '--cflags', -# '--fonts', -# '--input-plugins', -# '-v', -# '--version', -# '--svn-revision', -# ] -# -# # valid args should return 1 -# for item in valid: -# eq_(0,call([mc,item])) -# -# # errors should return 1 -# eq_(1,call([mc,''])) -# eq_(1,call([mc,'foo'])) +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__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index 0a5181777..0bfbf453f 100644 --- a/tests/python_tests/mapnik_logger_test.py +++ b/tests/python_tests/mapnik_logger_test.py @@ -1,5 +1,6 @@ #!/usr/bin/env python from nose.tools import * +from utilities import execution_path, run_all import mapnik def test_logger_init(): @@ -8,9 +9,10 @@ def test_logger_init(): 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(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__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index b5bf740ff..c8e6c827d 100644 --- a/tests/python_tests/markers_complex_rendering_test.py +++ b/tests/python_tests/markers_complex_rendering_test.py @@ -1,7 +1,7 @@ #coding=utf8 import os import mapnik -from utilities import execution_path +from utilities import execution_path, run_all from nose.tools import * def setup(): @@ -37,4 +37,4 @@ if 'csv' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 190fe9eee..9ba317325 100644 --- a/tests/python_tests/memory_datasource_test.py +++ b/tests/python_tests/memory_datasource_test.py @@ -1,5 +1,6 @@ #encoding: utf8 import mapnik +from utilities import execution_path, run_all from nose.tools import * def test_add_feature(): @@ -30,4 +31,4 @@ def test_add_feature(): eq_(len(retrieved), 0) if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index fff685487..ad15db7da 100644 --- a/tests/python_tests/multi_tile_raster_test.py +++ b/tests/python_tests/multi_tile_raster_test.py @@ -1,8 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import execution_path, contains_word - +from utilities import execution_path, run_all, contains_word import os, mapnik def setup(): @@ -66,4 +65,4 @@ def test_multi_tile_policy(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index e24034c8f..20ff5673c 100644 --- a/tests/python_tests/object_test.py +++ b/tests/python_tests/object_test.py @@ -3,8 +3,7 @@ import os from nose.tools import * -from utilities import execution_path -from utilities import Todo +from utilities import execution_path, run_all import tempfile import mapnik @@ -14,6 +13,10 @@ def setup(): # 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 @@ -87,6 +90,7 @@ 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) @@ -335,6 +339,16 @@ def test_map_init(): 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) @@ -550,4 +564,4 @@ def test_rule_init(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 9b6874a63..dd05add42 100644 --- a/tests/python_tests/ogr_and_shape_geometries_test.py +++ b/tests/python_tests/ogr_and_shape_geometries_test.py @@ -2,7 +2,7 @@ from nose.tools import * -from utilities import execution_path, Todo +from utilities import execution_path, run_all import os, sys, glob, mapnik @@ -41,4 +41,4 @@ if 'shape' in plugins and 'ogr' in plugins: if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index baf982bd7..4b29d5570 100644 --- a/tests/python_tests/ogr_test.py +++ b/tests/python_tests/ogr_test.py @@ -2,8 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path - +from utilities import execution_path, run_all import os, mapnik def setup(): @@ -26,22 +25,21 @@ if 'ogr' in mapnik.DatasourceCache.plugin_names(): # Shapefile properties def test_shapefile_properties(): - # 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 - # So: failure for the NOM_FR field is expected for older gdal ds = mapnik.Ogr(file='../../demo/data/boundaries.shp',layer_by_index=0) - f = ds.features_at_point(ds.envelope().center()).features[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') - # 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) + # 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): @@ -58,10 +56,10 @@ if 'ogr' in mapnik.DatasourceCache.plugin_names(): # 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.json',layer_by_index=0) + # 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() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 65300b135..c92b0f181 100644 --- a/tests/python_tests/osm_test.py +++ b/tests/python_tests/osm_test.py @@ -2,8 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path, Todo - +from utilities import execution_path, run_all import os, mapnik def setup(): @@ -50,4 +49,4 @@ if 'osm' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index edc64d55a..e7d3eff86 100644 --- a/tests/python_tests/palette_test.py +++ b/tests/python_tests/palette_test.py @@ -2,8 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path - +from utilities import execution_path, run_all import os, mapnik def setup(): @@ -27,23 +26,25 @@ def test_reading_palettes(): palette = mapnik.Palette('\xff\x00\xff\xff\xff\xff', 'rgb') eq_(palette.to_string(),expected_rgb); -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()) - # compare to expected - eq_(mapnik.Image.open('/tmp/mapnik-palette-test.png').tostring(),mapnik.Image.open('./images/support/mapnik-palette-test.png').tostring()) +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() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 1ff06a059..846ef31dc 100644 --- a/tests/python_tests/parameters_test.py +++ b/tests/python_tests/parameters_test.py @@ -4,8 +4,7 @@ import os import sys from nose.tools import * -from utilities import execution_path - +from utilities import execution_path, run_all import mapnik def setup(): @@ -59,4 +58,4 @@ def test_parameters(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + run_all(eval(x) for x in dir() if x.startswith("test_")) diff --git a/tests/python_tests/pickling_test.py b/tests/python_tests/pickling_test.py index e988ebee6..264ade67d 100644 --- a/tests/python_tests/pickling_test.py +++ b/tests/python_tests/pickling_test.py @@ -3,8 +3,7 @@ import os from nose.tools import * -from utilities import execution_path -from utilities import Todo +from utilities import execution_path, run_all import tempfile import mapnik, pickle @@ -43,4 +42,4 @@ def test_parameters_pickle(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index fc571ba28..e2bbc2e29 100644 --- a/tests/python_tests/png_encoding_test.py +++ b/tests/python_tests/png_encoding_test.py @@ -5,7 +5,7 @@ import sys import os, mapnik from timeit import Timer, time from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all def setup(): # All of the paths used are relative, if we run the tests @@ -131,8 +131,9 @@ def test_transparency_levels_aerial(): im_in = mapnik.Image.open('./images/support/transparency/aerial_rgb.png') eq_(len(im.tostring('png')),len(im_in.tostring('png'))) eq_(len(im.tostring('png:t=0')),len(im_in.tostring('png:t=0'))) + eq_(len(im.tostring('png:t=0')) == len(im_in.tostring('png')), False) if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] \ No newline at end of file + run_all(eval(x) for x in dir() if x.startswith("test_")) \ No newline at end of file diff --git a/tests/python_tests/pngsuite_test.py b/tests/python_tests/pngsuite_test.py index ca5f02f12..86ae7f61d 100644 --- a/tests/python_tests/pngsuite_test.py +++ b/tests/python_tests/pngsuite_test.py @@ -3,7 +3,7 @@ import os import mapnik from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all datadir = '../data/pngsuite' @@ -32,4 +32,4 @@ def test_broken_pngs(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 619326588..3da601afd 100644 --- a/tests/python_tests/postgis_test.py +++ b/tests/python_tests/postgis_test.py @@ -3,7 +3,7 @@ from nose.tools import * import atexit import time -from utilities import execution_path +from utilities import execution_path, run_all from subprocess import Popen, PIPE import os, mapnik from Queue import Queue @@ -138,6 +138,20 @@ 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)); +''' + def postgis_setup(): call('dropdb %s' % MAPNIK_TEST_DBNAME,silent=True) @@ -153,6 +167,8 @@ def postgis_setup(): 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) def postgis_takedown(): pass @@ -456,10 +472,15 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \ def create_ds(): ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME, table='test', - max_size=20) + max_size=20, + geometry_field='geom') fs = ds.all_features() 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() for i in range(NUM_THREADS): t = threading.Thread(target=create_ds) t.start() @@ -481,7 +502,8 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \ def test_that_64bit_int_fields_work(): ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME, - table='test8') + table='test8', + geometry_field='geom') eq_(len(ds.fields()),2) eq_(ds.fields(),['gid','int_field']) eq_(ds.field_types(),['int','int']) @@ -495,8 +517,147 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \ 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. + atexit.register(postgis_takedown) if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 1b5b3f5a8..52703f527 100644 --- a/tests/python_tests/python_plugin_test.py +++ b/tests/python_tests/python_plugin_test.py @@ -5,7 +5,7 @@ import os import math import mapnik import sys -from utilities import execution_path +from utilities import execution_path, run_all from nose.tools import * def setup(): @@ -16,7 +16,9 @@ def setup(): class PointDatasource(mapnik.PythonDatasource): def __init__(self): super(PointDatasource, self).__init__( - envelope = mapnik.Box2d(0,-10,100,110) + geometry_type = mapnik.DataGeometryType.Point, + envelope = mapnik.Box2d(0,-10,100,110), + data_type = mapnik.DataType.Vector ) def features(self, query): @@ -74,7 +76,9 @@ class ConcentricCircles(object): class CirclesDatasource(mapnik.PythonDatasource): def __init__(self, centre_x=-20, centre_y=0, step=10): super(CirclesDatasource, self).__init__( - geometry_type=mapnik.DataGeometryType.Polygon + 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 @@ -153,4 +157,4 @@ if 'python' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index ec636da09..074614a31 100644 --- a/tests/python_tests/query_test.py +++ b/tests/python_tests/query_test.py @@ -4,7 +4,7 @@ import os, mapnik from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all def setup(): # All of the paths used are relative, if we run the tests @@ -17,6 +17,10 @@ def test_query_init(): 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 @raises(TypeError) @@ -30,4 +34,4 @@ def test_query_resolution(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index a2ab9535c..092f0f3e0 100644 --- a/tests/python_tests/query_tolerance_test.py +++ b/tests/python_tests/query_tolerance_test.py @@ -1,8 +1,7 @@ #!/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(): @@ -41,4 +40,4 @@ if 'shape' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 585e19149..3bdb50941 100644 --- a/tests/python_tests/raster_colorizer_test.py +++ b/tests/python_tests/raster_colorizer_test.py @@ -1,7 +1,7 @@ #coding=utf8 import os import mapnik -from utilities import execution_path +from utilities import execution_path, run_all from nose.tools import * def setup(): @@ -103,4 +103,4 @@ def test_stop_label(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + run_all(eval(x) for x in dir() if x.startswith("test_")) diff --git a/tests/python_tests/raster_colormapped_test.py b/tests/python_tests/raster_colormapped_test.py index 9522013a6..de56346e0 100644 --- a/tests/python_tests/raster_colormapped_test.py +++ b/tests/python_tests/raster_colormapped_test.py @@ -1,7 +1,7 @@ #coding=utf8 import os import mapnik -from utilities import execution_path +from utilities import execution_path, run_all from nose.tools import * def setup(): @@ -37,4 +37,4 @@ if 'gdal' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 00f200f98..826514af1 100644 --- a/tests/python_tests/raster_symbolizer_test.py +++ b/tests/python_tests/raster_symbolizer_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import execution_path, contains_word, get_unique_colors +from utilities import execution_path, run_all, contains_word, get_unique_colors import os, mapnik @@ -195,4 +195,4 @@ def test_raster_warping_does_not_overclip_source(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index aaa28a923..ca0996707 100644 --- a/tests/python_tests/render_grid_test.py +++ b/tests/python_tests/render_grid_test.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all import os, mapnik try: @@ -15,371 +15,372 @@ def setup(): # from another directory we need to chdir() os.chdir(execution_path('.')) -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 - -# first pass impl where resolution is passed as render -# time rather than encoding time, likely will be deprecated soon -grid_correct_old = {"keys": ["", "North West", "North East", "South West", "South East"], "data": {"South East": {"Name": "South East"}, "North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!! ### ", " !!!!! ##### ", " !!!!! ##### ", " !!! ### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$$ %%%% ", " $$$$$ %%%%% ", " $$$$$ %%%%% ", " $$$ %%% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]} - -# now using svg rendering -grid_correct_old2 = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!! ### ", " !!! ### ", " !!! ### ", " !!! ### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$ %%% ", " $$$ %%% ", " $$$ %%% ", " $$$ %%% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} - -grid_correct_old3 = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!! ### ", " !!! ### ", " !!! ### ", " !!! ### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$ %%% ", " $$$ %%% ", " $$$ %%% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} - -# 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} - -# 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} - -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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} - -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_old(): - """ test old method """ - width,height = 256,256 - symb = mapnik.PointSymbolizer(mapnik.PathExpression('../data/images/dummy.png')) - sym = mapnik.MarkersSymbolizer() - sym.width = mapnik.Expression('10') - sym.height = mapnik.Expression('10') - m = create_grid_map(width,height,sym) - #print mapnik.save_map_to_string(m) - 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.render_grid(m,0,key='Name',resolution=4,fields=['Name']) - eq_(grid,grid_correct_old3,show_grids('old-markers',grid,grid_correct_old3)) - eq_(resolve(grid,0,0),None) - - # check every pixel of the nw symbol - expected = {"Name": "North West"} - - # top row - eq_(resolve(grid,23,9),expected) - eq_(resolve(grid,23,10),expected) - eq_(resolve(grid,23,11),expected) - -def test_render_grid_new(): - """ test old against new""" - 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "3", "4", "2", "1"]} - -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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "3", "4", "2", "1"]} - -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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!!! #### ", " !!!! #### ", " !!!! #### ", " !!!! #### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$$ %%%% ", " $$$$ %%%% ", " $$$$ %%%% ", " $$$$ %%%% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "3", "4", "2", "1"]} - -def test_point_symbolizer_grid(): - width,height = 256,256 - sym = mapnik.PointSymbolizer(mapnik.PathExpression('../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 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 + + # first pass impl where resolution is passed as render + # time rather than encoding time, likely will be deprecated soon + grid_correct_old = {"keys": ["", "North West", "North East", "South West", "South East"], "data": {"South East": {"Name": "South East"}, "North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!! ### ", " !!!!! ##### ", " !!!!! ##### ", " !!! ### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$$ %%%% ", " $$$$$ %%%%% ", " $$$$$ %%%%% ", " $$$ %%% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]} + + # now using svg rendering + grid_correct_old2 = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!! ### ", " !!! ### ", " !!! ### ", " !!! ### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$ %%% ", " $$$ %%% ", " $$$ %%% ", " $$$ %%% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} + + grid_correct_old3 = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!! ### ", " !!! ### ", " !!! ### ", " !!! ### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$ %%% ", " $$$ %%% ", " $$$ %%% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} + + # 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} + + # 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} + + 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "North West", "North East", "South West", "South East"]} + + 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_old(): + """ test old method """ + width,height = 256,256 + symb = mapnik.PointSymbolizer(mapnik.PathExpression('../data/images/dummy.png')) + sym = mapnik.MarkersSymbolizer() + sym.width = mapnik.Expression('10') + sym.height = mapnik.Expression('10') + m = create_grid_map(width,height,sym) + #print mapnik.save_map_to_string(m) + 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.render_grid(m,0,key='Name',resolution=4,fields=['Name']) + eq_(grid,grid_correct_old3,show_grids('old-markers',grid,grid_correct_old3)) + eq_(resolve(grid,0,0),None) + + # check every pixel of the nw symbol + expected = {"Name": "North West"} + + # top row + eq_(resolve(grid,23,9),expected) + eq_(resolve(grid,23,10),expected) + eq_(resolve(grid,23,11),expected) + + def test_render_grid_new(): + """ test old against new""" + 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $$ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "3", "4", "2", "1"]} + + 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !! ## ", " !!! ### ", " !! ## ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$ %% ", " $$$ %% ", " $ %% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "3", "4", "2", "1"]} + + 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": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " !!!! #### ", " !!!! #### ", " !!!! #### ", " !!!! #### ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " $$$$ %%%% ", " $$$$ %%%% ", " $$$$ %%%% ", " $$$$ %%%% ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], "keys": ["", "3", "4", "2", "1"]} + + def test_point_symbolizer_grid(): + width,height = 256,256 + sym = mapnik.PointSymbolizer(mapnik.PathExpression('../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() - [eval(run)() for run in dir() if 'test_' in run] + 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 index d3cc4f1e2..bc25e23ad 100644 --- a/tests/python_tests/render_test.py +++ b/tests/python_tests/render_test.py @@ -5,63 +5,83 @@ from nose.tools import * import tempfile import os, mapnik from nose.tools import * -from utilities import execution_path +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) - i = mapnik.Image(m.width, m.height) - - mapnik.render(m, i) - - s = i.tostring() - + 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(): - i = mapnik.Image(256, 256) - - i.background = mapnik.Color('black') - - s = i.tostring() - + 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') + s = im.tostring('png') - s = i.tostring('png') +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 im1.background = mapnik.Color('rgba(255,255,255,.5)') - + eq_(im1.painted(),False) + eq_(im1.is_solid(),True) # pure white im2 = mapnik.Image(w,h) im2.background = mapnik.Color('rgba(255,255,255,1)') im2.set_alpha(.5) - + eq_(im2.painted(),False) + eq_(im2.is_solid(),True) eq_(len(im1.tostring()), len(im2.tostring())) - def test_render_image_to_file(): - i = mapnik.Image(256, 256) - - i.background = mapnik.Color('black') - + im = mapnik.Image(256, 256) + im.background = mapnik.Color('black') if mapnik.has_jpeg(): - i.save('test.jpg') - i.save('test.png', 'png') - + 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: @@ -71,34 +91,32 @@ def get_paired_images(w,h,mapfile): tmp_map = 'tmp_map.xml' m = mapnik.Map(w,h) mapnik.load_map(m,mapfile) - i = mapnik.Image(w,h) + im = mapnik.Image(w,h) m.zoom_all() - mapnik.render(m,i) + mapnik.render(m,im) mapnik.save_map(m,tmp_map) m2 = mapnik.Map(w,h) mapnik.load_map(m2,tmp_map) - i2 = mapnik.Image(w,h) + im2 = mapnik.Image(w,h) m2.zoom_all() - mapnik.render(m2,i2) + mapnik.render(m2,im2) os.remove(tmp_map) - return i,i2 + return im,im2 def test_render_from_serialization(): try: - i,i2 = get_paired_images(100,100,'../data/good_maps/building_symbolizer.xml') - eq_(i.tostring(),i2.tostring()) + im,im2 = get_paired_images(100,100,'../data/good_maps/building_symbolizer.xml') + eq_(im.tostring(),im2.tostring()) - i,i2 = get_paired_images(100,100,'../data/good_maps/polygon_symbolizer.xml') - eq_(i.tostring(),i2.tostring()) + im,im2 = get_paired_images(100,100,'../data/good_maps/polygon_symbolizer.xml') + eq_(im.tostring(),im2.tostring()) 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() @@ -155,16 +173,25 @@ def test_render_with_scale_factor_zero_throws(): im = mapnik.Image(256, 256) mapnik.render(m,im,0.0) -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) - im.save('./images/support/marker-text-line-scale-factor-%s.png' % size,'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,'png8') + #im.save(expected_file,'png8') + # we save and re-open here so both png8 images are ready as full color png + actual = mapnik.Image.open(expected_file) + expected = mapnik.Image.open(expected_file) + eq_(actual.tostring(),expected.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual_file,expected_file)) if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 70bc6ff49..099f156b5 100644 --- a/tests/python_tests/save_map_test.py +++ b/tests/python_tests/save_map_test.py @@ -1,8 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import Todo -from utilities import execution_path +from utilities import execution_path, run_all import tempfile import os, sys, glob, mapnik @@ -12,50 +11,42 @@ def setup(): # from another directory we need to chdir() os.chdir(execution_path('.')) -def test(): - # TODO: Write a better test - # 1. Construct map in memory - # 2. Save map as XML - # 3. Load map to a second object - # 4. Compare both map objects - map = mapnik.Map(256, 256) +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): + 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 %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)) - raise Todo("map comparison is currently broken due to lacking relative paths support (#324,#340") - - def compare_map(in_map): - - mapnik.load_map(map, in_map) - - (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(map, test_map) - new_map = mapnik.Map(256, 256) - - mapnik.load_map(new_map, test_map) - open(test_map2,'w').write(mapnik.save_map_to_string(new_map)) - - diff = ' diff %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' % (in_map,diff)) - - if os.path.exists(test_map): - os.remove(test_map) - else: - # Fail, the map wasn't written - return False + if os.path.exists(test_map): + os.remove(test_map) + else: + # Fail, the map wasn't written + return False +def test_compare_map(): for m in glob.glob("../data/good_maps/*.xml"): compare_map(m) if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 2a47fca71..661092d6d 100644 --- a/tests/python_tests/shapefile_test.py +++ b/tests/python_tests/shapefile_test.py @@ -2,8 +2,7 @@ # -*- coding: utf-8 -*- from nose.tools import * -from utilities import execution_path - +from utilities import execution_path, run_all import os, mapnik def setup(): @@ -111,4 +110,4 @@ if 'shape' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + 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 index f27afb919..3ecba78e0 100644 --- a/tests/python_tests/sqlite_rtree_test.py +++ b/tests/python_tests/sqlite_rtree_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all from Queue import Queue import threading @@ -156,4 +156,4 @@ if 'sqlite' in mapnik.DatasourceCache.plugin_names(): if __name__ == "__main__": setup() - [eval(run)() for run in dir() if 'test_' in run] + run_all(eval(x) for x in dir() if x.startswith("test_")) diff --git a/tests/python_tests/sqlite_test.py b/tests/python_tests/sqlite_test.py index b0c8f864e..53edfe496 100644 --- a/tests/python_tests/sqlite_test.py +++ b/tests/python_tests/sqlite_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from nose.tools import * -from utilities import execution_path +from utilities import execution_path, run_all import os, mapnik @@ -311,18 +311,26 @@ if 'sqlite' in mapnik.DatasourceCache.plugin_names(): table='(select * from empty where !intersects!)', ) fs = ds.featureset() - feature = fs.next() + feature = None + try : + feature = fs.next() + except StopIteration: + pass eq_(feature,None) - def test_intersects_token1(): + 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 = fs.next() + feature = None + try : + feature = fs.next() + except StopIteration: + pass eq_(feature,None) - def test_intersects_token1(): + def test_intersects_token3(): ds = mapnik.SQLite(file='../data/sqlite/empty.db', table='(select * from empty where "a"!="b" and !intersects!)', ) @@ -379,6 +387,35 @@ if 'sqlite' in mapnik.DatasourceCache.plugin_names(): 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() - [eval(run)() for run in dir() if 'test_' in run] + 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 index 4c467ef31..816921be9 100644 --- a/tests/python_tests/style_test.py +++ b/tests/python_tests/style_test.py @@ -3,6 +3,7 @@ import os from nose.tools import * +from utilities import execution_path, run_all import mapnik def test_style_init(): @@ -14,4 +15,4 @@ def test_style_init(): eq_(s.image_filters,"") if __name__ == "__main__": - [eval(run)() for run in dir() if 'test_' in run] + 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 index d42dd94a3..9d413a97f 100644 --- a/tests/python_tests/utilities.py +++ b/tests/python_tests/utilities.py @@ -74,7 +74,8 @@ def run_all(iterable): sys.stderr.write(" Traceback:\n") for mline in traceback.format_tb(exc_tb): for line in mline.rstrip().split("\n"): - sys.stderr.write(" " + line + "\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 diff --git a/tests/python_tests/webp_encoding_test.py b/tests/python_tests/webp_encoding_test.py new file mode 100644 index 000000000..b468f1925 --- /dev/null +++ b/tests/python_tests/webp_encoding_test.py @@ -0,0 +1,98 @@ +#!/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('.')) + +tmp_dir = '/tmp/mapnik-webp/' +if not os.path.exists(tmp_dir): + os.makedirs(tmp_dir) + +opts = [ +'webp', +'webp:q=64', +] + + +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(): + 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) + im.save(actual,opt) + eq_(mapnik.Image.open(actual).tostring(), + mapnik.Image.open(expected).tostring(), + '%s (actual) not == to %s (expected)' % (actual,expected)) + + 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) + im.save(actual,opt) + eq_(mapnik.Image.open(actual).tostring(), + mapnik.Image.open(expected).tostring(), + '%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.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)) + eq_(t0_len,len(mapnik.Image.open(expected).tostring(format))) + + +if __name__ == "__main__": + setup() + run_all(eval(x) for x in dir() if x.startswith("test_")) \ No newline at end of file diff --git a/tests/run_tests.py b/tests/run_tests.py index 24db67b47..5d89dd9f3 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -4,8 +4,8 @@ import sys try: import nose -except ImportError: - 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\n") +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) from python_tests.utilities import TodoPlugin @@ -72,8 +72,8 @@ def main(): argv.append('-v') argv.append('-v') - dirname = os.path.dirname(sys.argv[0]) - argv.extend(['-w', dirname+'/python_tests']) + 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) diff --git a/tests/visual_tests/compare.py b/tests/visual_tests/compare.py index de406298b..9130059a3 100644 --- a/tests/visual_tests/compare.py +++ b/tests/visual_tests/compare.py @@ -10,9 +10,6 @@ except ImportError: COMPUTE_THRESHOLD = 16 -errors = [] -passed = 0 - # returns true if pixels are not identical def compare_pixels(pixel1, pixel2, alpha=True): if pixel1 == pixel2: @@ -34,33 +31,22 @@ def compare_pixels(pixel1, pixel2, alpha=True): return True return False -def fail(actual,expected,message): - global errors - errors.append((message, actual, expected)) - # compare two images and return number of different pixels -def compare(actual, expected, threshold=0, alpha=True): - global errors - global passed +def compare(actual, expected, alpha=True): im1 = mapnik.Image.open(actual) try: im2 = mapnik.Image.open(expected) except RuntimeError: - errors.append((None, actual, expected)) - return -1 + return 99999990 diff = 0 pixels = im1.width() * im1.height() delta_pixels = (im2.width() * im2.height()) - pixels if delta_pixels != 0: - errors.append((delta_pixels, actual, expected)) 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 - if diff > threshold: # accept one pixel different - errors.append((diff, actual, expected)) - passed += 1 return diff def compare_grids(actual, expected, threshold=0, alpha=True): @@ -70,38 +56,9 @@ def compare_grids(actual, expected, threshold=0, alpha=True): try: im2 = json.loads(open(expected).read()) except RuntimeError: - errors.append((None, actual, expected)) - return -1 + return 9999990 equal = (im1 == im2) - diff = 0 # TODO - real diffing if not equal: - errors.append((1, actual, expected)) - passed += 1 - return diff - -def summary(generate=False): - global errors - global passed - - if len(errors) != 0: - msg = "\nVisual text rendering: %s failed / %s passed" % (len(errors),passed) - print msg - for idx,error in enumerate(errors): - if error[0] is None: - if generate: - actual = open(error[1],'r').read() - open(error[2],'wb').write(actual) - print str(idx+1) + ") Generating reference image: '%s'" % error[2] - continue - else: - print str(idx+1) + ")Could not verify %s: No reference image found!" % error[1] - elif isinstance(error[0],int): - 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 - elif isinstance(error[0],str): - print str(idx+1) + ") \x1b[31mfailure to run test:\x1b[0m %s" % error[0] - sys.exit(1) - else: - msg = '\nAll %s visual tests passed: \x1b[1;32m✓ \x1b[0m' % passed - print msg - sys.exit(0) + return 99999999 + return 0 diff --git a/tests/visual_tests/data/Yosemite_L9.tfw b/tests/visual_tests/data/Yosemite_L9.tfw new file mode 100644 index 000000000..700a71cec --- /dev/null +++ b/tests/visual_tests/data/Yosemite_L9.tfw @@ -0,0 +1,6 @@ +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 new file mode 100644 index 000000000..a3fcc36b8 Binary files /dev/null and b/tests/visual_tests/data/Yosemite_L9.tif differ diff --git a/tests/visual_tests/data/grouped-rendering.sqlite b/tests/visual_tests/data/grouped-rendering.sqlite new file mode 100644 index 000000000..277c0f561 Binary files /dev/null and b/tests/visual_tests/data/grouped-rendering.sqlite differ diff --git a/tests/visual_tests/data/heat.tif b/tests/visual_tests/data/heat.tif new file mode 100644 index 000000000..5ea60e3aa Binary files /dev/null and b/tests/visual_tests/data/heat.tif differ diff --git a/tests/visual_tests/data/hex.dbf b/tests/visual_tests/data/hex.dbf new file mode 100644 index 000000000..193ea6e87 Binary files /dev/null and b/tests/visual_tests/data/hex.dbf differ diff --git a/tests/visual_tests/data/hex.prj b/tests/visual_tests/data/hex.prj new file mode 100644 index 000000000..eb0befd98 --- /dev/null +++ b/tests/visual_tests/data/hex.prj @@ -0,0 +1 @@ +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["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"],AXIS["X",EAST],AXIS["Y",NORTH]] \ No newline at end of file diff --git a/tests/visual_tests/data/hex.shp b/tests/visual_tests/data/hex.shp new file mode 100644 index 000000000..094a86793 Binary files /dev/null and b/tests/visual_tests/data/hex.shp differ diff --git a/tests/visual_tests/data/hex.shx b/tests/visual_tests/data/hex.shx new file mode 100644 index 000000000..ad2bdf266 Binary files /dev/null and b/tests/visual_tests/data/hex.shx differ diff --git a/tests/visual_tests/data/line-offset.csv b/tests/visual_tests/data/line-offset.csv new file mode 100644 index 000000000..fe557d89f --- /dev/null +++ b/tests/visual_tests/data/line-offset.csv @@ -0,0 +1,9 @@ +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.17429 50.191594,-5.174272 50.191738,-5.174283 50.191884,-5.174324 50.192026,-5.174394 50.192165,-5.174492 50.192296,-5.174615 50.192418,-5.174763 50.192529,-5.174931 50.192626,-5.175118 50.192708,-5.17532 50.192774,-5.175534 50.192823,-5.175756 50.192853,-5.175983 50.192865,-5.176209 50.192857,-5.176433 50.192831,-5.176649 50.192786,-5.176854 50.192724,-5.177044 50.192645,-5.177217 50.19255,-5.177369 50.192442,-5.177498 50.192323,-5.177601 50.192193,-5.177677 50.192056,-5.177724 50.191914)","",,4 +"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 50.191609,-5.178875 50.191754,-5.178887 50.191899,-5.178928 50.192042,-5.178998 50.19218,-5.179095 50.192311,-5.179219 50.192433,-5.179366 50.192544,-5.179535 50.192641,-5.179722 50.192724,-5.179924 50.19279,-5.180138 50.192838,-5.18036 50.192869,-5.180586 50.19288,-5.180813 50.192873,-5.181036 50.192846,-5.181252 50.192802,-5.181457 50.192739,-5.181648 50.19266,-5.18182 50.192566,-5.181972 50.192458,-5.182101 50.192338,-5.182204 50.192209,-5.18228 50.192072,-5.182328 50.19193)","",,3 +"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.183617 50.191624,-5.183664 50.191482,-5.18374 50.191345,-5.183843 50.191216,-5.183972 50.191096,-5.184124 50.190988,-5.184297 50.190894,-5.184487 50.190815,-5.184692 50.190752,-5.184908 50.190708,-5.185132 50.190681,-5.185358 50.190674,-5.185585 50.190685,-5.185807 50.190716,-5.186021 50.190764,-5.186223 50.19083,-5.18641 50.190913,-5.186578 50.19101,-5.186726 50.191121,-5.186849 50.191243,-5.186947 50.191374,-5.187017 50.191512,-5.187058 50.191655,-5.18707 50.1918,-5.187052 50.191945)","",,2 +"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.188341 50.191578,-5.188388 50.191436,-5.188464 50.191299,-5.188567 50.19117,-5.188696 50.19105,-5.188848 50.190942,-5.189021 50.190848,-5.189211 50.190769,-5.189416 50.190706,-5.189632 50.190661,-5.189856 50.190635,-5.190082 50.190627,-5.190309 50.190639,-5.190531 50.190669,-5.190744 50.190718,-5.190947 50.190784,-5.191134 50.190866,-5.191302 50.190964,-5.19145 50.191074,-5.191573 50.191196,-5.191671 50.191328,-5.191741 50.191466,-5.191782 50.191609,-5.191793 50.191754,-5.191775 50.191899)","",,1 +"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-offset.osm b/tests/visual_tests/data/line-offset.osm deleted file mode 100644 index 9a568dc30..000000000 --- a/tests/visual_tests/data/line-offset.osm +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/visual_tests/data/lines.csv b/tests/visual_tests/data/lines.csv new file mode 100644 index 000000000..f67763eba --- /dev/null +++ b/tests/visual_tests/data/lines.csv @@ -0,0 +1,10 @@ +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/lines.osm b/tests/visual_tests/data/lines.osm deleted file mode 100644 index e04b6fb14..000000000 --- a/tests/visual_tests/data/lines.osm +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/visual_tests/data/lower_columbia.tif b/tests/visual_tests/data/lower_columbia.tif new file mode 100644 index 000000000..1a0cfa892 Binary files /dev/null and b/tests/visual_tests/data/lower_columbia.tif differ diff --git a/tests/visual_tests/data/points.csv b/tests/visual_tests/data/points.csv new file mode 100644 index 000000000..f895b612f --- /dev/null +++ b/tests/visual_tests/data/points.csv @@ -0,0 +1,11 @@ +lat,long,name,nr +0,0,Test one,1 +0,0.1,Test two,2 +0,0.2,Test three,3 +0,0.3,Test four,4 +0,0.4,Test five,5 +0,0.5,Test six,6 +0,0.6,Test seven,7 +0,0.7,Test eight,8 +0,0.8,Test nine,9 +0,0.9,Test ten,10 \ No newline at end of file diff --git a/tests/visual_tests/data/points.osm b/tests/visual_tests/data/points.osm deleted file mode 100644 index 086f0a479..000000000 --- a/tests/visual_tests/data/points.osm +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 new file mode 100644 index 000000000..25daa99fc --- /dev/null +++ b/tests/visual_tests/grids/collision-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ! ", + " !! ", + " !!!! ", + " !!!!! ", + " !!!!! ", + " !!!!! ", + " !!!! ", + " !!! ", + " !!! ", + " !!!! ", + " !!!!! ", + " !!!!!!! ", + " !!!!!! ", + " !!!! ", + " ! !!! ", + " !!!! ", + " !!!!! ", + " !!!!!! ", + " !!!! ", + " !! ", + " !! ", + " !!!! ", + " !!!!! ", + " !!!!! ", + " !!!!! ", + " !!!! ", + " !! ", + " ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!! ", + " !!! ", + " !!!! ", + " ! ! ", + " ", + " ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!! ", + " !!! ", + " !!!! ", + " !!!! ", + " ! ", + " !! ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!! ", + " ! ", + " !!! ", + " !!!! ", + " !!!! ", + " !!! ", + " !!!! ", + " !!!! ", + " !!!! ", + " !!! ", + " ", + " !! ", + " !!! ", + " !!!! ", + " !!!! ", + " !!! ", + " !!!! ", + " !!! ", + " ! ! ! ", + " !! ", + " !!!! ", + " !!!!! ", + " !!!!!! ", + " !!!! ", + " !! ! !! ", + " !!!! ", + " !!!!! ", + " !!!!!!!! ", + " !!!!!! ", + " !! !!! ", + " !!!!!! ", + " !!!!!!!! ", + " !!!!!! !! ", + " !!! !!!! ", + " !!!!! !! ", + " !!!!!!!! ", + " !!!!!! ", + " !!! " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/collision-600-reference.json b/tests/visual_tests/grids/collision-600-reference.json deleted file mode 100644 index 46bbe72a3..000000000 --- a/tests/visual_tests/grids/collision-600-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/expressionformat-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/expressionformat-500-100-1.0-grid-reference.json new file mode 100644 index 000000000..c5fce6529 --- /dev/null +++ b/tests/visual_tests/grids/expressionformat-500-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/expressionformat-500-reference.json deleted file mode 100644 index 416408391..000000000 --- a/tests/visual_tests/grids/expressionformat-500-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 new file mode 100644 index 000000000..2725f745d --- /dev/null +++ b/tests/visual_tests/grids/formatting-1-500-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/formatting-1-500-reference.json deleted file mode 100644 index e0827b51f..000000000 --- a/tests/visual_tests/grids/formatting-1-500-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 new file mode 100644 index 000000000..2725f745d --- /dev/null +++ b/tests/visual_tests/grids/formatting-2-500-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/formatting-2-500-reference.json deleted file mode 100644 index e0827b51f..000000000 --- a/tests/visual_tests/grids/formatting-2-500-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 new file mode 100644 index 000000000..ef9f0089b --- /dev/null +++ b/tests/visual_tests/grids/formatting-3-500-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/formatting-3-500-reference.json deleted file mode 100644 index bc733d5b3..000000000 --- a/tests/visual_tests/grids/formatting-3-500-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 new file mode 100644 index 000000000..8bddd0118 --- /dev/null +++ b/tests/visual_tests/grids/formatting-4-500-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/formatting-4-500-reference.json deleted file mode 100644 index d0087f7c6..000000000 --- a/tests/visual_tests/grids/formatting-4-500-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/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 new file mode 100644 index 000000000..1a15981c2 --- /dev/null +++ b/tests/visual_tests/grids/gdal-filter-factor-600-400-1.0-grid-reference.json @@ -0,0 +1,108 @@ +{ + "keys": [ + "" + ], + "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 new file mode 100644 index 000000000..5a7be5994 --- /dev/null +++ b/tests/visual_tests/grids/geometry-transform-translate-200-200-1.0-grid-reference.json @@ -0,0 +1,59 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!! !!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ 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 new file mode 100644 index 000000000..0a2e7e41a --- /dev/null +++ b/tests/visual_tests/grids/jalign-auto-200-200-1.0-grid-reference.json @@ -0,0 +1,59 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!! ! ! ! ! ! !!! !!!!!! ! ! ", + " ! ! !!! ! !! !! ! !! ! ! !!! ! ", + " ", + " !! ! !! ! ! !!!! ! ", + " !!! ! ! !! !!!! ! ", + " ", + " ", + " ", + " ", + " ", + " !!!!!! ! ! !!!!!! ! ! ", + " ! ! !!! ! ! ! !!! ! ", + " ! ", + " !! ! !!!! ! ", + " !!! ! !!!! ! ", + " ", + " ", + " ", + " ", + " ", + " !!!!!! ! ! ! ! ! !!! !!!!!! ! ! ", + " ! ! !!! ! !! !! ! !! ! ! !!! ! ", + " ", + " !! ! !! ! ! !!!! ! ", + " !!! ! ! !! !!!! ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/jalign-auto-200-reference.json b/tests/visual_tests/grids/jalign-auto-200-reference.json deleted file mode 100644 index c486d0636..000000000 --- a/tests/visual_tests/grids/jalign-auto-200-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/line-offset-900-250-1.0-grid-reference.json b/tests/visual_tests/grids/line-offset-900-250-1.0-grid-reference.json new file mode 100644 index 000000000..db3484bdf --- /dev/null +++ b/tests/visual_tests/grids/line-offset-900-250-1.0-grid-reference.json @@ -0,0 +1,79 @@ +{ + "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-reference.json b/tests/visual_tests/grids/line-offset-900-reference.json deleted file mode 100644 index b828b16a7..000000000 --- a/tests/visual_tests/grids/line-offset-900-reference.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "keys": [ - "", - "-350", - "-400", - "-461", - "-302", - "-115", - "-117", - "-112", - "-118" - ], - "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 new file mode 100644 index 000000000..05e606e8b --- /dev/null +++ b/tests/visual_tests/grids/lines-1-200-200-1.0-grid-reference.json @@ -0,0 +1,67 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-1-200-reference.json deleted file mode 100644 index 2cf3f7024..000000000 --- a/tests/visual_tests/grids/lines-1-200-reference.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "200", - "206", - "202", - "204" - ], - "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 new file mode 100644 index 000000000..3859dd6c7 --- /dev/null +++ b/tests/visual_tests/grids/lines-1-400-400-1.0-grid-reference.json @@ -0,0 +1,117 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-1-400-reference.json deleted file mode 100644 index e76bcd5fe..000000000 --- a/tests/visual_tests/grids/lines-1-400-reference.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "206", - "202", - "200", - "204" - ], - "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 new file mode 100644 index 000000000..ae13670ff --- /dev/null +++ b/tests/visual_tests/grids/lines-1-600-600-1.0-grid-reference.json @@ -0,0 +1,167 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-1-600-reference.json deleted file mode 100644 index d1e67031d..000000000 --- a/tests/visual_tests/grids/lines-1-600-reference.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "data": {}, - "grid": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!! !!!!!!!!!!! ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " # ### # # # # # ", - " ######################################################################################################################################## ", - " ######################################################################################################################################## ", - " ######################################################################################################################################## ", - " ##### ### ####### ## ### # #### ### ###### #### #### ## ########## ## ##### ### ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $ $$ $$ $ $$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$ $$$$$ $$$ $$ $ $$$ $$ $$$$$ $ $$$$ $$$ ", - " ", - " ", - " ", - " ", - " ", - " ", - " %% % %% % % % %%%%%%%%% %%%%%%%%%%%%%%%% % %%%%%% %% %%%% %%%%%%%% %%%%%%%% %%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %% % % %% %%% %%%%%% %%% % % % %% %% % %% %% % ", - " ", - " ", - " ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&& &&& & && & ", - " ", - " ", - " ", - " ", - " '''' ", - " ( ''''''''' ", - " ((((((( )))))))))))))))))))))))))))) '''''''''''''' ", - " ((((((((((( )))))))))))))))))))))))))))) ''''''' '''''''' ", - " ((((((((((((((( )))))))))))))))))))))))))))) ''''' ''''' ", - " (((((( (((((( ))))))))))))))))))) ''' ''' ", - " (((( (((( '''' '''' ", - " ((( (((( ''' ''' ", - " (((( ((( '''' '''' ", - " ((( ((( '''' '''' ", - " (((( (((( ''' ''' ", - " ((( ((( '''' ''' ", - " ((( (((( '''' '''' ", - " (((( ((( ''' ''' ", - " ((( (((( '''' '''' ", - " (((( ((( ''' ''' ", - " (((( (((( ''''' ''''' ", - " (((( ((( ''''''' ''''''' ", - " (((((( (((((( ''''''''''''''' ", - " (((((((((((((((( '''''''''' ", - " (((((((((((( **************************** ''''' ", - " (((((((( **************************** ", - " ((( **************************** ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] -} \ No newline at end of file diff --git a/tests/visual_tests/grids/lines-2-800-reference.json b/tests/visual_tests/grids/lines-1-800-800-1.0-grid-reference.json similarity index 52% rename from tests/visual_tests/grids/lines-2-800-reference.json rename to tests/visual_tests/grids/lines-1-800-800-1.0-grid-reference.json index 3be96c9ce..75c1e0755 100644 --- a/tests/visual_tests/grids/lines-2-800-reference.json +++ b/tests/visual_tests/grids/lines-1-800-800-1.0-grid-reference.json @@ -1,217 +1,217 @@ { - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "data": {}, - "grid": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " !!! !! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " #################################################################################################################################################################################### ", - " #################################################################################################################################################################################### ", - " #################################################################################################################################################################################### ", - " ######### ######## ######## ######## #################### ########## ############ # # ## ", - " ## ## ## # ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$ $$$$$$$ $$$$$$$$ $$$$$$$$$ $$$$$$$$$$$ $ $ ", - " $$ $$ ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " %%% %% % % %% % %%%% %%%%%%%%%% %%% %%%% %%%% %%%%%%%%%%% %% %%%%% %% % %%% %%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " % % % % % %%% % %% % %% % %% % % %% % %% % % ", - " ", - " ", - " ", - " ", - " ", - " & & & & & ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&& &&&& &&&&&&&& &&&&&&&&&&&&& &&&& &&&&&&&&&&&&&&& &&& &&&& &&&& &&&&&& & &&&& &&& & && & & && &&&&&& ", - " & & ", - " ", - " ", - " ", - " ", - " ", - " ", - " '' ", - " ''''''' ", - " ( '''''''''''' ", - " ((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''' ", - " (((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''' '''''''' ", - " ((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''' '''''' ", - " (((((((( (((((((( ))))))))))))))))))) '''' '''' ", - " (((((( (((((( '''' '''' ", - " (((( ((((( ''' ''' ", - " (((( ((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( (((( ''' ''' ", - " ((( ((( '''' '''' ", - " (((( (((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( ((( '''' '''' ", - " ((( (((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( (((( '''''' '''''' ", - " (((( (((( '''''''' ''''''' ", - " (((((( ((((( ''''''''''''''''' ", - " (((((((( (((((((( ''''''''''''' ", - " (((((((((((((((((( '''''''' ", - " (((((((((((( ************************************** ''' ", - " (((((((( ************************************** ", - " ((( ************************************** ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] + "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 new file mode 100644 index 000000000..4b34f29ff --- /dev/null +++ b/tests/visual_tests/grids/lines-2-200-200-1.0-grid-reference.json @@ -0,0 +1,67 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-2-200-reference.json deleted file mode 100644 index c1380c9a4..000000000 --- a/tests/visual_tests/grids/lines-2-200-reference.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "200", - "206", - "202", - "204" - ], - "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 new file mode 100644 index 000000000..3aa89339a --- /dev/null +++ b/tests/visual_tests/grids/lines-2-400-400-1.0-grid-reference.json @@ -0,0 +1,117 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-2-400-reference.json deleted file mode 100644 index efdbcde3b..000000000 --- a/tests/visual_tests/grids/lines-2-400-reference.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "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 new file mode 100644 index 000000000..6269e3550 --- /dev/null +++ b/tests/visual_tests/grids/lines-2-600-600-1.0-grid-reference.json @@ -0,0 +1,167 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-2-600-reference.json deleted file mode 100644 index d47a0c333..000000000 --- a/tests/visual_tests/grids/lines-2-600-reference.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "data": {}, - "grid": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!! !!!!!!!!!!! ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " # ## ## # # ## ## ", - " ######################################################################################################################################## ", - " ######################################################################################################################################## ", - " ######################################################################################################################################## ", - " ######### ### ### ######## ######## # ######### ######## ## ####### ### ######## ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $ $$ $$$$ $ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$ $$$$ $$$$ $ $ $ $ $ $ $ $$$$ $$ $ $$ $ ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " ", - " ", - " ", - " ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " ", - " ", - " ", - " ", - " ", - " '''' ", - " ( ''''''''' ", - " ((((((( )))))))))))))))))))))))))))) '''''''''''''' ", - " ((((((((((( )))))))))))))))))))))))))))) ''''''' '''''''' ", - " ((((((((((((((( )))))))))))))))))))))))))))) ''''' ''''' ", - " (((((( (((((( ))))))))))) ))))))) ''' ''' ", - " (((( (((( '''' '''' ", - " ((( (((( ''' ''' ", - " (((( ((( '''' '''' ", - " ((( ((( '''' '''' ", - " (((( (((( ''' ''' ", - " ((( ((( '''' ''' ", - " ((( (((( '''' '''' ", - " (((( ((( ''' ''' ", - " ((( (((( '''' '''' ", - " (((( ((( ''' ''' ", - " (((( (((( ''''' ''''' ", - " (((( ((( ''''''' ''''''' ", - " (((((( (((((( ''''''''''''''' ", - " (((((((((((((((( '''''''''' ", - " (((((((((((( **************************** ''''' ", - " (((((((( **************************** ", - " ((( **************************** ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] -} \ No newline at end of file diff --git a/tests/visual_tests/grids/lines-1-800-reference.json b/tests/visual_tests/grids/lines-2-800-800-1.0-grid-reference.json similarity index 51% rename from tests/visual_tests/grids/lines-1-800-reference.json rename to tests/visual_tests/grids/lines-2-800-800-1.0-grid-reference.json index a6f82c616..98a1c1a8c 100644 --- a/tests/visual_tests/grids/lines-1-800-reference.json +++ b/tests/visual_tests/grids/lines-2-800-800-1.0-grid-reference.json @@ -1,217 +1,217 @@ { - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "data": {}, - "grid": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " !!!! !! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " #################################################################################################################################################################################### ", - " #################################################################################################################################################################################### ", - " #################################################################################################################################################################################### ", - " ################## ######## ############################# ########### ############ ", - " ## ## ## # ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$ $$$$$$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$$$ ", - " $$ $$ ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " %% % %% % % % %%%%%%%%% %%%%%%%%%%%%%%%% % %%%%%% %% %%%% %%%%%%%% %%%%%%%% %%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %% % % %% %%% %%%%%% %%% % % % %% %% % %% %% % ", - " ", - " ", - " ", - " ", - " ", - " & & & & & & ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " & &&&&&&&&&&& &&&& &&& && &&&& && &&&&&&&&&& &&&& & &&& &&&& &&&& &&&&&&&&&&&&& &&&& &&& &&&&&&& & && &&&&&&&&&&&&&& ", - " & & & ", - " ", - " ", - " ", - " ", - " ", - " ", - " '' ", - " ''''''' ", - " ( '''''''''''' ", - " ((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''' ", - " (((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''' '''''''' ", - " ((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''' '''''' ", - " (((((((( (((((((( ))))))))))) ))))))) '''' '''' ", - " (((((( (((((( '''' '''' ", - " (((( ((((( ''' ''' ", - " (((( ((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( (((( ''' ''' ", - " ((( ((( '''' '''' ", - " (((( (((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( ((( '''' '''' ", - " ((( (((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( (((( '''''' '''''' ", - " (((( (((( '''''''' ''''''' ", - " (((((( ((((( ''''''''''''''''' ", - " (((((((( (((((((( ''''''''''''' ", - " (((((((((((((((((( '''''''' ", - " (((((((((((( ************************************** ''' ", - " (((((((( ************************************** ", - " ((( ************************************** ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] + "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 new file mode 100644 index 000000000..05e606e8b --- /dev/null +++ b/tests/visual_tests/grids/lines-3-200-200-1.0-grid-reference.json @@ -0,0 +1,67 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-3-200-reference.json deleted file mode 100644 index 2cf3f7024..000000000 --- a/tests/visual_tests/grids/lines-3-200-reference.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "200", - "206", - "202", - "204" - ], - "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 new file mode 100644 index 000000000..3859dd6c7 --- /dev/null +++ b/tests/visual_tests/grids/lines-3-400-400-1.0-grid-reference.json @@ -0,0 +1,117 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-3-400-reference.json deleted file mode 100644 index 3535d4503..000000000 --- a/tests/visual_tests/grids/lines-3-400-reference.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "206", - "202", - "200", - "204" - ], - "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 new file mode 100644 index 000000000..67b4633c9 --- /dev/null +++ b/tests/visual_tests/grids/lines-3-600-600-1.0-grid-reference.json @@ -0,0 +1,167 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-3-600-reference.json deleted file mode 100644 index 141b45013..000000000 --- a/tests/visual_tests/grids/lines-3-600-reference.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "data": {}, - "grid": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " # ### # # # # # ", - " ######################################################################################################################################## ", - " ######################################################################################################################################## ", - " ######################################################################################################################################## ", - " ##### ### ####### ## ### # #### ### ###### #### #### ## ########## ## ##### ### ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $ $$$ $$$$ $ $$ $$ $$$$ $$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$ $$$ $ $ $$ $$$ $$$$ $$$ $$$$ $ $ $$$ $$$$$ $$$$ $ $ $$ $$$ $ $$$$$ $$ $$$$ $ ", - " ", - " ", - " ", - " ", - " ", - " ", - " %% % %% % % % %%%%%%%%% %%%%%%%%%%%%%%%% % %%%%%% %% %%%% %%%%%%%% %%%%%%%% %%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %% % % %% %%% %%%%%% %%% % % % %% %% % %% %% % ", - " ", - " ", - " ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&& &&& & && & ", - " ", - " ", - " ", - " ", - " '''' ", - " ( ''''''''' ", - " ((((((( )))))))))))))))))))))))))))) '''''''''''''' ", - " ((((((((((( )))))))))))))))))))))))))))) ''''''' '''''''' ", - " ((((((((((((((( )))))))))))))))))))))))))))) ''''' ''''' ", - " (((((( (((((( ))))))))))))))))))) ''' ''' ", - " (((( (((( '''' '''' ", - " ((( (((( ''' ''' ", - " (((( ((( '''' '''' ", - " ((( ((( '''' '''' ", - " (((( (((( ''' ''' ", - " ((( ((( '''' ''' ", - " ((( (((( '''' '''' ", - " (((( ((( ''' ''' ", - " ((( (((( '''' '''' ", - " (((( ((( ''' ''' ", - " (((( (((( ''''' ''''' ", - " (((( ((( ''''''' ''''''' ", - " (((((( (((((( ''''''''''''''' ", - " (((((((((((((((( '''''''''' ", - " (((((((((((( **************************** ''''' ", - " (((((((( **************************** ", - " ((( **************************** ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] -} \ No newline at end of file diff --git a/tests/visual_tests/grids/lines-3-800-reference.json b/tests/visual_tests/grids/lines-3-800-800-1.0-grid-reference.json similarity index 51% rename from tests/visual_tests/grids/lines-3-800-reference.json rename to tests/visual_tests/grids/lines-3-800-800-1.0-grid-reference.json index b5c386f88..e7bd89e95 100644 --- a/tests/visual_tests/grids/lines-3-800-reference.json +++ b/tests/visual_tests/grids/lines-3-800-800-1.0-grid-reference.json @@ -1,217 +1,217 @@ { - "keys": [ - "", - "216", - "212", - "210", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "data": {}, - "grid": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " !!!! !! !!!! !! !!!! !! !!!! !! !!!! !! !!!! !! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " #################################################################################################################################################################################### ", - " #################################################################################################################################################################################### ", - " #################################################################################################################################################################################### ", - " ################## ######## ############################# ########### ############ ################## ######## ############################# ########### ############ ", - " ## ## ## # ## ## ## # ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", - " $$$$$$$$$ $$$$$$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$$$ $$$$$$$$$ $$$$$$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$$$ $$$$$$$$$ $$$$$$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$$$ ", - " $$ $$ $$ $$ $$ $$ ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " %% % %% % % % %%%%%%%%% %%%%%%%%%%%%%%%% % %%%%%% %% %%%% %%%%%%%% %%%%%%%% %%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", - " %% % % %% %%% %%%%%% %%% % % % %% %% % %% %% % ", - " ", - " ", - " ", - " ", - " ", - " & & & & & & ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", - " & &&&&&&&&&&& &&&& &&& && &&&& && &&&&&&&&&& &&&& & &&& &&&& &&&& &&&&&&&&&&&&& &&&& &&& &&&&&&& & && &&&&&&&&&&&&&& ", - " & & & ", - " ", - " ", - " ", - " ", - " ", - " ", - " '' ", - " ''''''' ", - " ( '''''''''''' ", - " ((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''' ", - " (((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''' '''''''' ", - " ((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''' '''''' ", - " (((((((( (((((((( ))))))))))) ))))))) '''' '''' ", - " (((((( (((((( '''' '''' ", - " (((( ((((( ''' ''' ", - " (((( ((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' ''' ", - " (((( ((( ''' '''' ", - " ((( (((( '''' '''' ", - " (((( (((( ''' ''' ", - " ((( ((( '''' '''' ", - " (((( (((( '''' ''' ", - " (((( (((( ''' '''' ", - " ((( ((((( '''' '''' ", - " (((( (((( '''' '''' ", - " ((( (((( ''' '''' ", - " ((( (((( '''' '''' ", - " ((((( (((( '''''' '''''' ", - " ((((( ((((( '''''''' ''''''' ", - " (((((( (((((( ''''''''''''''''' ", - " ((((((((( (((((((( ''''''''''''' ", - " (((((((((((((((((( '''''''' ", - " ( (((((((((((( ************************************** ''' ", - " (((((((((( ************************************** ", - " (((( ************************************** ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] + "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-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-200-200-1.0-grid-reference.json new file mode 100644 index 000000000..9fd0cc8c0 --- /dev/null +++ b/tests/visual_tests/grids/lines-shield-200-200-1.0-grid-reference.json @@ -0,0 +1,65 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-shield-200-reference.json deleted file mode 100644 index 1b6ee2cc3..000000000 --- a/tests/visual_tests/grids/lines-shield-200-reference.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "keys": [ - "", - "212", - "210", - "132", - "208", - "206", - "200", - "202", - "204" - ], - "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 new file mode 100644 index 000000000..cfac4935e --- /dev/null +++ b/tests/visual_tests/grids/lines-shield-400-400-1.0-grid-reference.json @@ -0,0 +1,117 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-shield-400-reference.json deleted file mode 100644 index 7ff3c42a8..000000000 --- a/tests/visual_tests/grids/lines-shield-400-reference.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "132", - "208", - "240", - "206", - "202", - "200", - "204" - ], - "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 new file mode 100644 index 000000000..a43b5759d --- /dev/null +++ b/tests/visual_tests/grids/lines-shield-600-600-1.0-grid-reference.json @@ -0,0 +1,167 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-shield-600-reference.json deleted file mode 100644 index 16810c994..000000000 --- a/tests/visual_tests/grids/lines-shield-600-reference.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "132", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "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 new file mode 100644 index 000000000..6ec6c7d12 --- /dev/null +++ b/tests/visual_tests/grids/lines-shield-800-800-1.0-grid-reference.json @@ -0,0 +1,217 @@ +{ + "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-reference.json b/tests/visual_tests/grids/lines-shield-800-reference.json deleted file mode 100644 index 08b9ace9c..000000000 --- a/tests/visual_tests/grids/lines-shield-800-reference.json +++ /dev/null @@ -1,218 +0,0 @@ -{ - "keys": [ - "", - "216", - "212", - "210", - "132", - "208", - "240", - "202", - "200", - "206", - "204" - ], - "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 new file mode 100644 index 000000000..b633480e3 --- /dev/null +++ b/tests/visual_tests/grids/list-100-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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/list-100-reference.json b/tests/visual_tests/grids/list-100-reference.json deleted file mode 100644 index 9c48a8b23..000000000 --- a/tests/visual_tests/grids/list-100-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/list-150-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-150-100-1.0-grid-reference.json new file mode 100644 index 000000000..aacf5a57b --- /dev/null +++ b/tests/visual_tests/grids/list-150-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "keys": [ + "", + "4", + "6", + "7", + "8", + "9", + "2", + "1", + "3", + "5", + "10" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!!! # $ % % && ", + " '' !! ! !! ###$$$ %% & ", + " ", + " ( ' ) ! * # $ % & + ", + " ", + " ", + " ) ) +++", + " ))))) ) )))) ++ ", + " ) ))))) )) )))) ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/list-150-reference.json b/tests/visual_tests/grids/list-150-reference.json deleted file mode 100644 index 6ff4d3534..000000000 --- a/tests/visual_tests/grids/list-150-reference.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "keys": [ - "", - "-1", - "-2", - "-4", - "-6", - "-7", - "-8", - "-9", - "-3", - "-5", - "-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 new file mode 100644 index 000000000..3ead5a120 --- /dev/null +++ b/tests/visual_tests/grids/list-250-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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/list-250-reference.json b/tests/visual_tests/grids/list-250-reference.json deleted file mode 100644 index 0356b25bd..000000000 --- a/tests/visual_tests/grids/list-250-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/list-300-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-300-100-1.0-grid-reference.json new file mode 100644 index 000000000..91ac6b3da --- /dev/null +++ b/tests/visual_tests/grids/list-300-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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/list-300-reference.json b/tests/visual_tests/grids/list-300-reference.json deleted file mode 100644 index 5fa935dc6..000000000 --- a/tests/visual_tests/grids/list-300-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/list-400-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-400-100-1.0-grid-reference.json new file mode 100644 index 000000000..ea336f358 --- /dev/null +++ b/tests/visual_tests/grids/list-400-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "keys": [ + "", + "1", + "3", + "5", + "7", + "9", + "10", + "2", + "4", + "6", + "8" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!! !! # ######## $$ $$$$ $ %%% %%% %%% &&& &&& & ' ''' ", + " !! ! ! ### # ## # $$ $ $$$ % % % %% & & && ''''' ", + " ", + " ! ( # ) $ * % + & ' ", + " ", + " ", + " ( ( ) * + ", + " ( ((( ( (((( ( ))))) )))) ***** * * ++ + ++ + ++ ", + " ( ((((( (( ((( ))))) ) ))))) * ***** ** * ++++ + ++ +++ + ", + " + ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/list-400-reference.json b/tests/visual_tests/grids/list-400-reference.json deleted file mode 100644 index 7e6cbc5a5..000000000 --- a/tests/visual_tests/grids/list-400-reference.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "keys": [ - "", - "-1", - "-3", - "-5", - "-7", - "-9", - "-10", - "-2", - "-4", - "-6", - "-8" - ], - "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 new file mode 100644 index 000000000..a846513de --- /dev/null +++ b/tests/visual_tests/grids/list-600-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/list-600-reference.json deleted file mode 100644 index c12801c9f..000000000 --- a/tests/visual_tests/grids/list-600-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-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-800-100-1.0-grid-reference.json new file mode 100644 index 000000000..692e6adac --- /dev/null +++ b/tests/visual_tests/grids/list-800-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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/list-800-reference.json b/tests/visual_tests/grids/list-800-reference.json deleted file mode 100644 index 8c348d27d..000000000 --- a/tests/visual_tests/grids/list-800-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/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 new file mode 100644 index 000000000..552311907 --- /dev/null +++ b/tests/visual_tests/grids/marker-multi-policy-600-400-1.0-grid-reference.json @@ -0,0 +1,110 @@ +{ + "keys": [ + "", + "1", + "2" + ], + "data": {}, + "grid": [ + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " ! ", + " # ! ", + " # # # ! ", + " # # # # ! ", + " # # # # ! ", + " # # # # ! ", + " # # # # ! ", + " # ## # ! ", + " # ## # ! ", + " # ## # ! !!!!! ", + " # ## # ! !!!!!! ", + " # ## ## ! !!!!!!!! ", + " # ### # ! !!!!!!!! ", + " # ## # ! !!!!!!!! ! ", + " # # # ! !!!!!!! ! ", + " # # # ! !!!!!! ! ", + " # # # ! ! ", + " # # # ! ! ", + " # # # # ! ! ", + " # # # # ! ! ", + " # # # # ! ! ", + " # # # # ! ! ", + " # # # ! ! ", + " # ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " !! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ! !! ", + " ! !!! ! ! ", + " ! !!!!! ! ! ", + " ! !!!!! ! ! ", + " ! !!!!! ! ! ", + " ! !!!! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! !!! ! !!! ! ", + " ! !!!!!! ! !!!!!! ! ", + " ! !!!!!!! ! !!!!!!!! ! ", + " ! !!!!!!! ! !!!!!!!! ! ", + " ! !!!!!!!! ! !!!!!!!! ! ", + " ! !!!!!!! ! !!!!!!!! ! ", + " ! !!!!!!! ! !!!!!! ! ", + " ! !!!!! ! !!!! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! ", + " ! ! ! " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-multi-policy-600-reference.json b/tests/visual_tests/grids/marker-multi-policy-600-reference.json deleted file mode 100644 index 906661c5e..000000000 --- a/tests/visual_tests/grids/marker-multi-policy-600-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 new file mode 100644 index 000000000..6562f4630 --- /dev/null +++ b/tests/visual_tests/grids/marker-on-hex-grid-257-256-1.0-grid-reference.json @@ -0,0 +1,73 @@ +{ + "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 new file mode 100644 index 000000000..bb8f37083 --- /dev/null +++ b/tests/visual_tests/grids/marker-on-hex-grid-400-600-1.0-grid-reference.json @@ -0,0 +1,159 @@ +{ + "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 new file mode 100644 index 000000000..3c1cfc85b --- /dev/null +++ b/tests/visual_tests/grids/marker-on-hex-grid-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "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 new file mode 100644 index 000000000..49e277165 --- /dev/null +++ b/tests/visual_tests/grids/marker-on-line-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ! ", + " !! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! !!! ", + " ! !!! ", + " ! !! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! ! ! ", + " ! ! ", + " ! !! " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-on-line-600-reference.json b/tests/visual_tests/grids/marker-on-line-600-reference.json deleted file mode 100644 index 16697474c..000000000 --- a/tests/visual_tests/grids/marker-on-line-600-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-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-1.0-grid-reference.json new file mode 100644 index 000000000..13b79ad2e --- /dev/null +++ b/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "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-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-1.0-grid-reference.json new file mode 100644 index 000000000..faa0d55b3 --- /dev/null +++ b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! ", + " !!! !!!!! !", + " !! !!!!! !!!!! ", + " !!!! !!!!! !!!!! ", + " !!!! !!!!!!!!!!!! !!!! ", + " !!!! !!!!!!!!!!!! !!!! ", + " !!! !!!!! !!!!!! !!!! ", + " !!! !!!!! !!!!!! !!!! !! ", + " ! !!!!! !!!!! !!!!! !!! ", + " !!!!! !!!!!!!!!!! !!!! ", + " !!!! !!!!!!!!!!! !!!! ", + " !!! !!!!! !!!!! !!!!! ", + " !! !!!!! !!!!! !!!!! ! ", + " !! !!!! !!!!! !!!!! !!! ", + " !!!! !!!!!! !!!!! !!! ", + " !!!! !!!!!!!!!!!! !!!! ", + " !!!! !!!!! !!!!!! !!!! ", + " !!! !!!!! !!!!!! !!!! ", + " !!! !!!!! !!!!! !!!!! !! ", + " !!!!! !!!!! !!!!! !!! ", + " !!!! !!!!!!!!!!! !!!! ", + " !!!! !!!!!!!!!!! !!!! ", + " !!!! !!!!! !!!!! !!!!! ", + " !! !!!!! !!!!! !!!!! ! ", + " !! !!!! !!!!!! !!!!! !!! ", + " !!!! !!!!!! !!!!! !!!! ", + " !!!! !!!!!!!!!!!! !!!! ", + " !!! !!!!! !!!!! !!!! ", + " !!! !!!!! !!!!! !!!!! !! ", + " !!!!! !!!!! !!!!! !! ", + " !!!!! !!!!! !!! ", + "!!!!!! !!! ", + " !!!!! ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-reference.json deleted file mode 100644 index 2928dcfd7..000000000 --- a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-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 new file mode 100644 index 000000000..faa0d55b3 --- /dev/null +++ b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "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-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-reference.json deleted file mode 100644 index 2928dcfd7..000000000 --- a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-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 new file mode 100644 index 000000000..20f9c8fc2 --- /dev/null +++ b/tests/visual_tests/grids/marker-path-expression-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "1" + ], + "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 new file mode 100644 index 000000000..a6ae153e0 --- /dev/null +++ b/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "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 new file mode 100644 index 000000000..c9c95ba75 --- /dev/null +++ b/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json @@ -0,0 +1,37 @@ +{ + "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 new file mode 100644 index 000000000..20f9c8fc2 --- /dev/null +++ b/tests/visual_tests/grids/marker-svg-opacity2-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !! ", + " !! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ 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 new file mode 100644 index 000000000..65e360604 --- /dev/null +++ b/tests/visual_tests/grids/marker-with-background-image-257-256-1.0-grid-reference.json @@ -0,0 +1,73 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " !!!!!!!! ", + " !!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!! " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-with-background-image-257-reference.json b/tests/visual_tests/grids/marker-with-background-image-257-reference.json deleted file mode 100644 index e8ba67222..000000000 --- a/tests/visual_tests/grids/marker-with-background-image-257-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-400-600-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-400-600-1.0-grid-reference.json new file mode 100644 index 000000000..f2542d6ca --- /dev/null +++ b/tests/visual_tests/grids/marker-with-background-image-400-600-1.0-grid-reference.json @@ -0,0 +1,159 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!! ", + " !!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-with-background-image-400-reference.json b/tests/visual_tests/grids/marker-with-background-image-400-reference.json deleted file mode 100644 index 370b7ac8b..000000000 --- a/tests/visual_tests/grids/marker-with-background-image-400-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 new file mode 100644 index 000000000..0d1bf213f --- /dev/null +++ b/tests/visual_tests/grids/marker-with-background-image-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "keys": [ + "", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!! ", + " !!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!!!!!!!!! ", + " !!!!!!!!!!!!!!!! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-with-background-image-600-reference.json b/tests/visual_tests/grids/marker-with-background-image-600-reference.json deleted file mode 100644 index d05b80b47..000000000 --- a/tests/visual_tests/grids/marker-with-background-image-600-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 new file mode 100644 index 000000000..65e360604 --- /dev/null +++ b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-1.0-grid-reference.json @@ -0,0 +1,73 @@ +{ + "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 new file mode 100644 index 000000000..f2542d6ca --- /dev/null +++ b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-1.0-grid-reference.json @@ -0,0 +1,159 @@ +{ + "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 new file mode 100644 index 000000000..0d1bf213f --- /dev/null +++ b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "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 new file mode 100644 index 000000000..6e3fccbf5 --- /dev/null +++ b/tests/visual_tests/grids/marker_line_placement_on_points-500-100-1.0-grid-reference.json @@ -0,0 +1,40 @@ +{ + "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-reference.json b/tests/visual_tests/grids/marker_line_placement_on_points-500-reference.json deleted file mode 100644 index eb5e8d76b..000000000 --- a/tests/visual_tests/grids/marker_line_placement_on_points-500-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/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 new file mode 100644 index 000000000..24cbf9092 --- /dev/null +++ b/tests/visual_tests/grids/road-casings-grouped-rendering-500-100-1.0-grid-reference.json @@ -0,0 +1,344 @@ +{ + "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 ?? @ ", + " !#M$NB BOZ[]^^_`8abcd/e99fgL ? 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 new file mode 100644 index 000000000..905b2fb7a --- /dev/null +++ b/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-1.0-grid-reference.json @@ -0,0 +1,887 @@ +{ + "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", + "743", + "50", + "92", + "38", + "213", + "847", + "741", + "492", + "841", + "254", + "747", + "827", + "568", + "39", + "53", + "439", + "753", + "224", + "607", + "5", + "61", + "158", + "840", + "438", + "214", + "835", + "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", + "844", + "144", + "125", + "758", + "834", + "831", + "719", + "780", + "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", + "767", + "501", + "503", + "142", + "117", + "18", + "28", + "742", + "731", + "745", + "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", + "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 ", + " \u0125\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\u0125\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\u0125\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', \u010b\u015a\u015a\u013b\u013b \u013b\u013b\u013b \u0134\u0134\u0134\u0134\u0146\u0146\u0146\u0150\u0150\u0150 \u015d", + "\u015b\u00f6 \u0147\u0124\u015e\u0148 \u0116\u0116\u0112\u0112 \u0140\u0141\u0141 \u015c\u015c \u015c \u0110\u0111\u0127\u0127\u0128\u015f\u015f\u015f\u0159\u0159\u0159\u0159 \u0160\u0160\u0161\u0161\u0161\u014d\u014d\u014d\u014d\u014d\u0156\u0156\u00fa\u00fa\u0133\u014c\u014c & ',, \u010b\u015a \u013b\u013b \u013b\u013b\u0162\u013b\u013b \u0134\u0134\u0134\u0146\u0146\u0146\u0146\u0150\u0150\u0150 \u015d\u015d\u0163", + " \u015b \u0164\u0125\u0125 \u0116\u0116\u0140\u0140\u0141 \u015c\u015c \u015c\u0165 \u0110\u0111\u0127\u0128\u015f\u015f\u015f\u015f\u0161\u0161\u0161\u0161\u0161\u0160\u0160\u0161\u0161\u0161\u014d\u014d\u014d \u0156\u0156\u0156\u00fa\u00fa\u0133 \u014c \u0166 \u014e', \u010b\u010b \u013b\u013b \u013b\u0162\u0162\u0162\u013b\u013b\u013b \u0167\u0167\u0167\u0134\u0134\u0134\u0134\u0146\u0146\u0146\u0146 \u0150\u0150\u0150 \u015d\u0163\u0163\u0168\u0169", + "\u016a \u015b\u015b \u0124\u015e\u0125 \u0116\u0140\u0141 \u015c \u0165\u0165 \u0110\u0111\u0127\u0128\u015f\u015f\u015f\u016b\u016b\u016b\u016b\u016b\u016b\u016b\u0160\u0160\u016b\u0161\u0161 \u016c\u0156\u00fa\u00fa\u0133\u0154\u0155\u014c\u014c \u0166\u00da\u014e',\u016d \u010b\u010b \u013b\u013b \u013b \u0162\u0162\u0167\u0167\u0167\u0167\u0167\u0167\u0167\u0167\u0167\u0134\u016e\u0134\u0146\u0146\u0146\u0146\u016f\u016f \u0150\u0150 \u015d\u0163\u0163\u0168\u0169\u0169 ", + "\u0170\u016a \u015b\u015b \u0147\u0124\u0125\u0148 \u0140\u0141 \u015c \u0110\u0111\u0127\u0127\u015f\u015f\u016b\u016b\u016b\u016b\u016b\u0171\u0171\u0171\u016b\u016b\u0160\u016b\u016b\u016b \u016c\u0172\u0172\u0133\u0173\u0173\u0154\u0155\u014c \u0174\u00da\u014e\u00cb ,\u016d \u0175\u0175\u010b\u010b \u013b\u013b\u0176 \u0167 \u0177\u0134\u016e\u016e\u0146\u0146\u0146 \u0178\u016f \u0150\u0150 \u015d\u0163\u0163\u0168\u0169\u0169 ", + "\u0170\u016a\u016a \u0179\u015b \u0147\u0124\u0125\u0125 \u0140\u0141\u0141 \u015c \u0110\u0111\u0127\u0127\u015f\u015f\u016b\u016b\u016b\u0171\u0171\u0171\u0171\u0171\u0171\u0171\u0171\u0160\u016b\u016b\u016b\u016b\u016b \u016c\u016c\u0172\u0172\u017a\u017b\u0173\u0173\u0155\u014c \u0166\u00da \u014e',\u016d\u016d\u0175\u0175 \u0175\u0175\u0175\u010b \u0176\u0176\u0176 \u0167 \u0177\u0177\u0177\u016e\u017c\u0146\u0146 \u0178\u0178\u0178\u016f \u0150 \u015d\u0163\u0163\u0163\u0168\u0169\u0169 ", + "\u0170 \u016a\u016a\u0179 \u015b \u0124\u0125\u0125 \u0140\u0140\u0141 \u015c\u015c \u0110\u0110\u0111\u0127\u015f\u015f\u016b\u016b\u0171\u0171 \u017d\u017d \u0160\u0160\u0171\u016b\u016b\u016b\u016b\u017e\u017e\u017f\u017a\u017a\u017b\u017b\u0173\u0154\u014c \u0166\u00da \u014e',,\u016d\u0175 \u010b\u010b \u0167\u0167\u0167\u0177\u0177\u0177\u0180\u016e\u0181\u017c \u0178\u0178\u0178 \u016f \u0150 \u015d\u0163\u0163\u0182\u0168\u0169\u0169 \u0183\u0183", + "\u0170\u016a\u016a\u0179\u0179 \u015b\u015b \u0147\u0124\u0125\u0148 \u0140\u0140\u0141 \u015c\u015c \u0110\u0111\u0127\u015f\u015f\u015f\u016b\u0171\u0171 \u017d \u017d\u017d\u017d\u017d \u0184\u0184\u0171\u0185\u0185\u016b\u016b\u017e\u017e\u017f\u017a\u017a\u017b\u017b\u0173\u0173\u0155\u014c \u0174\u00da \u014e', \u016d \u010b\u010b \u0167\u0167\u0167\u0177\u0177\u0177\u0180\u017c\u017c\u0181 \u0178\u0178\u0178 \u016f\u016f \u0150 \u015d\u0163\u0163\u0168\u0168\u0169\u0169 \u0183\u0183\u0183 ", + " \u016a\u0179\u0179 \u015b\u015b \u0147\u0124\u0125\u0148\u0140\u0141 \u0186\u0187 \u0110\u0111\u0127\u0127\u015f\u015f\u016b\u0171\u0171 \u017d\u017d\u0188 \u017d\u017d\u0189\u0184\u0189\u0185\u0185 \u017e\u017e\u017f\u017f\u017a\u017a \u017b\u017b\u0173\u0155\u014c \u0174\u00da \u014e',, \u016d \u010b\u010b\u0167\u0177\u0177\u0177\u0180\u0180\u017c\u017c\u0181 \u0178\u0178 \u018a\u018a\u016f \u0150 \u015d\u0163\u0163\u0168\u0168\u0169\u0169 \u0183\u0183 ", + "\u016a \u0179\u018b \u015b\u015b \u0124\u0148\u0148\u0141 \u0186 \u0187 \u0111\u0127\u0127\u015f\u015f\u016b\u0171\u0171 \u017d\u017d \u0188\u0188\u0188\u0188\u0188 \u018c\u0184\u0189\u0185\u0185\u0185\u017e\u017e\u017f\u017f\u017a\u017a \u017b\u017b\u0173\u0155\u014c\u018d\u018e\u018e\u018e\u018f\u014e\u00cb', \u016d \u0190\u0190\u0177\u0180\u016e\u017c\u017c\u0181 \u0178\u0178\u0178 \u018a\u018a\u018a\u016f\u016f\u0150 \u015d\u0163\u0163\u0168\u0169\u0169\u0169 \u0183\u0183 ", + " \u0191 \u015b\u015b \u0140\u0147\u0141 \u0192 \u0187 \u0111\u0111\u0127\u015f\u015f\u016b\u016b\u0171 \u017d\u017d \u0193\u0193 \u0188\u0188\u0188\u017d\u0184\u0184\u0189\u0185\u0185\u017e\u017e\u017f\u016b\u017a\u017a\u017a\u017b\u017b\u0173\u018d \u0174\u0194 \u018f\u018f\u014e',, \u016d \u0177\u0177 \u0190\u0190\u0190\u017c\u0181 \u0178\u0178\u0178 \u018a\u018a \u016f\u0150\u0150 \u015d\u0163\u0182\u0168\u0169\u0169\u0169 \u0183\u0183 ", + "\u0179 \u015b\u015b \u0140\u0140\u0141 \u0192\u0192\u0187\u0187 \u0111\u0127\u015f\u015f\u015f\u016b\u0171\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 \u0174\u0194 \u018f\u014e\u00cb', \u016d\u016d \u0177\u0177 \u0198\u016e\u0199\u017c\u0190\u0190 \u016f\u016f\u016f\u016f\u018a\u018a\u018a \u016f \u0150 \u0163\u0163\u0182\u0168\u0169\u0169 \u0183\u0183 ", + "\u019a \u019b\u019b\u015b \u0140\u0141 \u019c\u019c\u019c\u019c\u019c \u0111\u0127\u0127\u015f\u015f\u016b\u0171\u0195\u0195\u0195 \u0193\u0193\u0193\u0193 \u0184\u0189\u0189\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u017b\u0196\u0197 \u0174\u00da \u018f \u014e',, \u016d \u0177\u0177 \u0180\u016e\u017c\u017c\u0181\u0181 \u019f\u019f \u016f\u016f\u016f\u016f\u01a0\u01a0\u016f\u016f\u0150 \u015d\u015d\u0163\u01a1\u0168\u0169\u0169 \u0183\u0183 ", + " \u019b \u015b \u0140\u0141\u0141 \u019c\u019c\u01a2\u01a2\u01a2\u01a2 \u0111\u0127\u0127\u015f\u015f\u016b\u016b\u0195\u0195\u0195 \u0193 \u0184\u0184\u0189\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u017b\u0196\u0197 \u0174 \u0194 \u01a3\u014e\u00cb',\u01a4\u0177\u0177 \u0180\u016e\u017c\u017c\u0181\u0181 \u01a0\u01a0 \u0150\u0150 \u015d\u0163\u0163\u01a1\u0168\u0169\u0169 \u0183\u0183 ", + " \u01a5 \u019b \u015b\u015b\u0140\u0141\u0141 \u01a2\u01a2\u01a2\u01a2\u01a2\u01a2\u01a2\u01a2 \u0111\u0127\u0127\u015f\u015f\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 \u0174 \u0194 \u01a9\u01aa\u01a4\u01a4 \u0180\u016e\u017c\u017c \u0181\u0181 \u01a0\u01a0 \u0150 \u015d\u0163\u0163\u01a1\u0169\u0169\u0169 \u0183\u0183 ", + " \u01a5\u01a5\u01ab\u01ab\u01ab \u015b\u0140\u0141 \u01a2\u01a2\u01a2 \u01a2\u01a2 \u0111\u0127\u015f\u015f\u015f\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 \u0174 \u0194\u00da \u01a9\u01a9\u01aa\u01a4\u01a4\u017c\u017c \u0181\u0181 \u01a0\u01a0 \u0150 \u015d\u0163\u01a1\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\u015f\u015f\u01b5\u0195\u0195 \u01b6\u01a7 \u01ac\u01ac \u01a7\u01ad\u01ad \u01ae\u0184\u0184\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u0196 \u0174\u0174 \u0194\u00da \u0177\u0177\u01a9\u01b7\u01aa\u01a4\u01a4 \u0181\u0181 \u01a0\u01a0\u01a0\u01a0\u01a0 \u01b8\u0150\u015d\u0163\u0182\u01af\u0168\u0169\u0169 \u0183\u0183 ", + "\u01b1\u01b0\u01b0 \u01b9\u01b9 \u01ab \u01ba\u01bb\u01b2\u019c\u01a2\u01a2\u01b4\u01b4 \u01b4 \u01bc\u0111\u0127\u0127\u01bd\u015f\u01be\u01b5\u01b5 \u01a7\u01b6\u01b6\u01b6 \u01ac\u01ac \u01a7 \u01ae\u0184\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u0196\u0196 \u0174 \u01bf\u01c0\u01c1\u0177 \u0180\u0180\u01a9\u01a9\u01aa\u01a4\u01a4\u0181 \u01a0\u01a0\u01a0\u01a0 \u01a0\u01a0\u01a0 \u015d\u015d\u0163\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 \u0174\u0174 \u01bf\u01c0\u01c0\u01cc\u0180\u017c\u017c\u01a9\u01b7\u01aa\u01a4\u01a4 \u01a0\u01a0 \u01a0\u01a0\u015d\u01b8\u0163\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 \u0174\u0174 \u01c1\u01c1\u01bf\u01c0\u01c0\u01d2\u017c \u0181\u0181\u01a9\u01b7\u01aa\u01a4 \u01a0\u01a0 \u01a0\u015d\u015d\u01d3\u0163\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\u01d4\u01d4\u01a7\u01a7\u01d0\u01d0 \u01cb\u01cb \u01b6\u01b6 \u01a7 \u01ae \u0184\u0184\u019d\u01d1\u01d1\u01d1\u01d1\u0196\u01d5\u0174\u0174\u01c1\u01c1\u01d6\u01d7\u01bf\u01c0\u01c0 \u0181\u0181\u0181 \u01d8\u01d9\u01da\u01da\u01a0\u01a0\u01a0\u01a0\u01a0 \u01a0\u015d\u01d3\u01d3\u0163\u0168\u0169\u0169 \u01db\u01db \u0183\u0183 ", + " \u016a \u01c3\u01dc\u019b \u01ab \u01c5\u01ce\u01dd\u01de\u01dd\u01cf\u01cf\u01cf \u0111\u0127\u0127\u01bd\u01bd\u01bd\u01b5\u01b5 \u01d4\u01df\u01df \u01d0\u01d0 \u01cb\u01cb \u01b6\u01b6\u01a7 \u01ae \u0184\u01d1\u01d1\u01d1\u01d1\u016b\u01d5\u01d5\u0174\u01c1\u01d6\u01e0\u01d7\u01d7\u01bf\u01c0\u01c0\u0181\u0181 \u01d8\u01d9\u01da\u01a0 \u01a0\u01d3\u01d3\u0163\u0163\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\u01d4\u01df\u01df \u01d0\u01d0 \u01cb\u01cb\u01a7\u01a7 \u01ae \u01d1\u01d1\u01d1\u01d1\u01e8\u01e8\u01d5\u01d5\u01e9\u01e0\u01ea\u01eb\u01ec\u01ed\u01bf\u01bf\u01c0 \u01d8\u01ee\u01d9\u01da\u01a0 \u01a0\u015d\u0163\u0163\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\u01d4\u01d4 \u01df\u01df \u01d0\u01d0\u01a7\u01a7\u01cb\u01a7 \u01ae\u01f4\u01f4\u01d1\u01d1\u01f5\u01f6\u01f6\u01e8\u01d5\u01d5\u01ea\u01eb\u01f7\u01ed\u0181\u0181\u01bf\u01c0\u01c0 \u01ee\u01d9\u01da\u01da \u01a0\u015d\u0163\u0163\u0168\u0169\u0169\u0169 \u01ef \u01f8\u01f0\u01f0\u01f0 \u01f9\u01db\u01db \u01e2 ", + " \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\u01d4 \u01a7\u01a7\u01df\u01a7\u01a7\u01a7 \u01f4\u01f4\u01f4\u01f4\u01f4\u01fc\u01f5\u01f5\u01f6\u01f6\u01d5\u01d5\u01ed\u01ec\u0181\u0181\u0181 \u01bf \u01d8\u01d8\u01d9\u01da\u01a0 \u01a0\u01a0\u015d\u0163\u0163\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\u0171\u01e5\u01e5\u01e5 \u01f3\u01e5\u01e5\u01e5\u01d4\u01e5 \u01ff\u01ff\u01f4\u01f4\u01f4\u01f4 \u0174\u01fc\u01fc\u01f5\u01f6\u01f6\u0200\u01d5\u01ec\u0181\u0181 \u0201\u0202 \u01d8\u01ee\u01d9\u0203\u0203\u0203\u0163\u0163\u0168\u0169\u0169 \u01ef \u01f8\u01f8 \u01e2 ", + "\u0174 \u01e3\u01e3\u01e3 \u01fa\u01ab \u01c5\u01ce \u01fe \u0204\u0205\u0206\u01dd\u01dd\u0127\u0127\u01bd\u01bd\u01bd\u0171\u0171 \u01e5\u01e5\u01e5\u01e5\u01e5\u01e5\u01e5\u01d4\u01d4 \u01ff\u01ff\u01ff\u01ff\u01ff\u0207\u0207\u0207\u0207\u01f4 \u0174\u0174\u01c1\u01e9\u01fc\u01f5\u01f6\u01f6\u01f6\u01d5\u0181 \u0208\u0208 \u0201\u0202 \u0203\u0203\u0209\u0209\u020a\u0168\u0169\u0169 \u01ef \u01db\u01db \u01e2 ", + "\u0174\u0174 \u020b\u01e3\u01e3\u01e3 \u01fa\u01fa\u01fa \u01c5\u01ce\u01fe\u01fe\u0204 \u0205\u020c\u01dd\u0127\u0127\u0128\u01bd\u01bd\u01be\u0171 \u01e5\u01e5\u01e5\u01e5\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u0207\u0207\u0207\u0207\u0207\u0207\u0207 \u0174\u0174\u01c1\u01e9\u01d7\u01d7\u01fc\u01fc\u01f5\u01f6\u01f6\u01d5\u020d \u0208\u0208\u020e \u0201\u0202 \u020f\u0203\u0209\u020a\u0210\u0210\u0210 \u01ef\u01db \u01db\u01db \u01e2 ", + "\u0211\u0174\u0174 \u0212\u0213\u01e3\u01e3\u0214\u0214 \u01fa\u01fa\u01fa \u01c5\u01ce\u01fe\u01fe\u0204 \u0205 \u020c\u0127\u0127\u0128\u01bd\u01bd\u01bd\u0171 \u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u0215\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u0207\u0207\u0207\u0207\u0207\u0207\u0207 \u0174\u0174\u01c1\u01e9\u01d7\u016e\u016e\u01f7 \u01fc\u01f5\u01f5\u0216\u0217\u020d\u0208\u0208 \u020e \u0201\u0202 \u020f\u020f\u0218\u0219\u021a\u0210\u0210\u0210\u01da \u01ef \u01db\u01db \u01e2 ", + "\u0211\u01c1\u01c1\u0174\u0212 \u0213\u0213\u021b\u0214\u0214\u0214\u0214 \u01fa\u01fa\u01fa\u01c5\u01ce\u01fe\u0204\u0204\u0205 \u020c \u0127\u0128\u01bd\u01bd\u01bd\u0171 \u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u021c\u0215\u0215 \u0207\u0207\u0207\u0207\u0207 \u0174\u0174\u01c1\u01e9\u01d7\u016e\u016e\u01f7 \u0181\u0181\u01fc\u021d\u021e\u021e\u0216\u020d\u020d \u0201\u0202 \u020f\u0218\u0218\u021f\u0219\u0220\u0220\u0210\u01d8\u01ee\u01d9\u01da \u01ef \u0221\u0221\u0221 \u01e2 ", + "\u0222\u0211\u0211\u0212\u0212\u0174 \u0213\u0213 \u021b\u0214\u0214\u0214\u0214 \u01c5\u01fa\u020c\u020c\u0204\u0205\u0205\u020c \u0127\u0127\u01bd\u01bd\u01bd\u0171\u01ff\u01ff\u01ff\u01ff\u01ff\u0223\u0224\u0224\u0225\u021c\u021c\u021c\u0215\u0215 \u0207\u0207\u0207\u0207\u0207 \u0174\u0174\u01c1\u01e9\u0226\u016e\u01d7\u01f7 \u0181\u0181 \u021d\u021e\u021e\u0216\u0216\u020d\u0197 \u0201\u0202 \u020f\u0218\u0218\u021f\u0220\u0220\u0220\u0227\u0227\u0227 \u01ee\u01ee\u01d9\u01da \u01ef \u0228 \u0221\u0221\u0221\u0221\u0221\u0221\u0221\u0221\u0221\u0221 ", + "\u0229\u0222\u0211\u0212\u0212\u0174\u0174 \u0213\u0213\u022a\u021b\u021b\u0214\u0214\u0214\u0214 \u020c\u0205\u020c \u0127\u0127\u0128\u01bd\u01bd\u01be\u01ff\u01ff\u01ff\u01ff\u01ff\u022b\u0223 \u021c\u021c\u021c\u022c\u022d \u0215\u0215\u0207\u0207\u0207 \u0174\u01c1\u01c1\u01e9\u0226\u01d7\u016e\u01f7 \u0181\u0181 \u021d\u021d\u021e\u021e\u0216\u020d\u020d \u0201\u0202 \u020f\u0218\u0218\u021f\u0220\u0220\u0220 \u022e \u0227 \u01d8\u01ee\u01d9\u01da \u01ef \u0228 \u01e2\u022f\u022f\u022f\u022f\u022f ", + " \u0229\u0229\u0222\u0211\u0212\u01c1\u0174\u0174 \u0230 \u021b\u021b\u0214\u0214\u0214\u0214 \u020c\u0127\u0127\u0128\u01bd\u01bd\u01bd\u01ff\u01ff\u01ff\u0231\u0232\u0232\u022b\u021c\u021c\u0224\u0224\u0225 \u022c\u022d \u0215\u0215\u0207 \u0174\u01c1\u01c1\u01e9\u01e9\u01d7\u016e\u01f7\u01f7\u0181\u0181 \u021d\u021e\u021e\u0216\u0216\u020d\u0197 \u0233\u0233\u0218\u0218\u021f\u0220\u0220\u0220 \u0234\u022e \u0227 \u01ee\u01ee\u01d9\u01da \u01ef \u0228 \u01e2 \u022f\u022f\u022f\u022f\u022f\u022f ", + "\u0235\u0235 \u0229\u0222\u0211\u0211 \u01c1\u0174\u0230\u0230 \u021b\u021b\u0214\u0214\u0214\u0214\u0127\u0128\u01bd\u01bd\u01bd\u01ff\u01ff\u01ff \u0231 \u021c\u021c\u022b\u0223 \u0224\u0225\u0225\u022c\u022d\u0236 \u0174\u01c1\u01c1\u01e9\u01e9\u01d7\u01d7\u016e\u01f7\u0181\u0181 \u021d\u021d\u021e\u021e\u0216\u020d\u020d\u0237\u0238\u0239\u0239\u0239\u021f\u0220\u0220\u0220 \u023a \u0234 \u022e \u023b\u023b\u0227 \u01d8\u01ee\u01d9\u01da \u01ef \u0228 \u01e2 ", + " \u0235\u0235 \u0229\u0222\u0211\u0211\u0230\u0230\u0174\u0174\u0174 \u021b\u021b\u021b\u0214\u0214\u01bd\u01bd\u01bd\u01ff\u01ff\u01ff \u023c\u021c\u021c\u0232 \u022b \u0223\u0224 \u0225\u0236 \u0174\u01c1\u01c1\u01e9\u01e9\u01d7\u01d7\u01f7\u01f7\u0181\u0181 \u023d\u021d\u021e\u021e\u0216\u0237\u0237\u0237\u023e\u023f\u0240\u0241\u0220\u0220 \u023a\u023a \u0234 \u0242\u022e\u023b \u0227\u0227 \u01ee\u01ee\u01d9\u01da \u01ef \u0228 \u01e2 ", + " \u0235\u0235 \u0229\u0222\u0230\u0230 \u01c1\u01c1\u0174\u0174 \u021b\u0127 \u0243\u0243\u01ff\u01ff\u01ff \u023c\u0231 \u0232\u022b\u022b\u0223\u0236\u0224 \u0174\u0174\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 \u01d8\u01ee\u01d9\u01da \u01ef \u0228 \u01e2 ", + "\u0246\u0246\u0246\u0246\u0246\u0235\u0235 \u0230\u0222\u0222\u0211\u0211\u01c1\u01c1\u0174\u0174\u0174 \u0247 \u0243\u0243\u0171\u01ff\u01ff \u023c \u0231\u0232 \u022b\u0236 \u0174\u0174\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 \u01d8\u01ee\u01d9\u01da \u01ef \u0228 \u01e2 ", + " \u0235\u0235\u024f \u0229\u0229\u0222\u0211\u0211\u0211\u01c1\u0174\u0174\u0250\u0250\u0251\u0243\u0243\u01ff\u01ff \u023c\u0231\u0236\u0232 \u0174\u0174\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 \u01d8\u01ee\u01d9\u01da \u01ef\u01ef \u0228 \u01e2 ", + "\u0257 \u0258\u0258\u0258 \u0259\u025a\u025a\u025a \u0229\u0229\u0229\u0211\u0211\u0250\u0250\u0251\u0251\u025b\u025b\u025c\u01ff \u025d\u025d \u023c\u0236 \u0174\u0174\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 \u01d8\u01ee\u01d9\u01da \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 \u0174\u0174\u0174\u01c1\u01e9\u01e9\u01e9\u01f7\u01f7 \u0181\u0181\u0181 \u0252\u0252\u0252\u0252 \u025e\u0222\u0222\u0222\u0262\u0263\u0264\u0260\u0260\u024b\u024b\u0216\u0254\u0254\u0255\u0265 \u024c \u024e\u024e \u01ee \u01da\u01da \u01ef \u0228\u0228 \u01e2 ", + " \u0266\u0257 \u0259\u0267 \u0268\u0269 \u0250\u0250\u0251\u025b\u025b\u025c\u025c\u0181\u01c1\u0174\u0174\u01c1\u0174\u0174\u0174\u0174\u01c1\u0174\u01c1\u01c1\u01e9\u01e9\u01f7\u01f7\u01f7 \u0181\u0181\u0181 \u0252\u0252\u0252\u0252 \u0222\u0222\u0229\u0222\u0262\u0262\u026a\u0263\u026b\u026c\u024b\u024b\u021e\u021e\u0216\u0254\u0255\u0255\u0265\u0265\u0265\u0265 \u026d\u026d\u026d\u026d\u026d \u026e \u024e\u024e \u01d8\u01d8 \u01da\u01da\u01ef\u01ef \u0228 \u01e2 ", + "\u0266 \u0257\u0257 \u0261\u0261\u0267 \u026f \u0270\u0270\u0251\u025b\u025b\u025b\u025c\u0229\u0229\u0229\u0222\u0181\u0181\u0181 \u01e9\u01e9\u0271\u01f7\u01f7\u0181\u0181\u0181 \u0252\u0252\u0252 \u0222\u0222\u0222\u0222\u0229\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 \u01d8\u01ee \u01da \u01ef \u0228 \u01e2 ", + "\u0266 \u0257\u0257 \u0261 \u0267 \u026f \u0270\u0270\u0275\u0275\u025b\u025b\u025c\u025c \u0229\u0222\u0222\u0229\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0276\u0276\u0276\u0252\u0252 \u0222\u0222\u0222\u0222\u0222\u0229\u0262\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 \u01d8\u01d8\u01d9\u01da\u01ef\u01ef \u0228 \u01e2 \u027e", + " \u0257\u0257\u0261 \u0267 \u026f \u0270\u0270\u0275\u0275\u027f\u027f\u025c\u025c\u0280 \u0281\u0229\u0271\u0229\u0222\u0222\u0222\u0276\u0276\u0276\u0276\u0276\u0222\u0222\u0222\u0222\u0229\u0222\u0222\u0222\u0229\u0229\u0262\u0262\u0262\u0262\u0262 \u0282\u0282\u0272\u0277\u0277\u026b\u0278\u0279\u0283\u0274 \u027a \u0254\u0254\u0255\u0216\u027c\u027c\u027c\u0284\u0285\u0286\u0287\u0287\u027d \u027d\u027d\u027d\u027d \u026d\u026d \u01d8\u01ee\u01d9\u01da\u01ef \u0228\u0228 \u01e2 \u027e\u027e\u027e\u027e\u027e", + " \u0288\u0257 \u0267 \u026f \u0270\u0275\u0275\u027f\u027f\u0289\u0289 \u0280 \u0281\u0281\u028a\u028a\u028a \u028b\u0276\u0276\u0276\u0276\u0229\u0229\u0262\u0262\u0262\u0262\u0262\u0262\u0262\u0262 \u0282\u028c\u028d\u0272\u0277\u0263\u0273\u0278\u0279\u0283\u0274 \u027a \u0254\u0255\u0255\u027c\u027c\u0284\u0284\u0285\u028e \u0287 \u027d\u027d\u027d \u026d\u026d \u01d8\u01ee\u01d9\u01ef\u01ef \u0228\u0228 \u01e2 \u027e\u027e\u027e\u027e\u027e\u027e\u028f\u028f\u028f", + " \u0288 \u0257\u0257 \u026f \u0270\u0270\u0275\u027f\u027f\u027f\u0289 \u0280 \u0281\u0281\u028a\u028a \u028b\u028b\u028b \u0262\u0262\u0262\u0262\u0262\u0262 \u0282\u028c\u028c\u028c\u028d\u0277\u026b\u026b\u0278\u0279\u0283\u0274\u027a\u027a \u0254\u0255\u027c\u0284\u0284\u0285\u0285\u020d\u020d\u0290\u0291 \u027d\u027d\u027d \u026d \u01ee\u01ee\u01d9\u01ef\u01ef \u0228\u0228\u01e2\u01e2 \u027e\u027e\u027e\u027e\u027e\u027e\u028f\u028f\u028f\u028f\u028f\u028f ", + " \u0288\u0288 \u0257\u0257 \u0270\u0270\u0275\u027f\u027f\u027f\u0289 \u0280\u0281\u0281\u028a\u028a \u028b\u0262\u0262\u0262\u0262\u0262 \u0282\u028c\u028c\u028c\u028d\u0277\u0277\u0263\u0273\u0278\u0279\u0283\u0274\u027a\u027a \u0292\u0293\u027c\u0284\u0284\u0285\u021e\u0216\u027b\u020d\u0290\u0291 \u027d\u027d \u026d\u026d\u01d8\u01ee\u01d9\u01ef \u0228\u0228 \u027e\u027e\u027e\u027e\u027e\u027e\u028f\u028f\u028f\u028f\u028f\u028f ", + " \u0288\u0288 \u0294\u0294\u0257\u0270\u0270\u0275\u0275\u027f\u027f\u0289\u0289 \u0295\u028a\u028a \u028b\u028b\u0262\u0262\u0262 \u028c\u028c\u028d\u028d\u0277\u0277\u0296\u026c\u0278\u0283\u0283 \u027a\u027a \u0292\u0293\u0297\u0297\u0285\u0285\u021e\u021e\u021e\u0216\u020d\u020d\u0290\u0291\u0291\u0291\u0291 \u027d \u026d\u026d\u01d8 \u01da\u01ef \u01e2 \u027e\u027e\u0298\u027e\u027e\u027e\u028f\u028f\u028f\u028f\u028f\u028f ", + " \u0288 \u0294\u0294 \u0299\u0299\u0275\u0275\u027f\u027f\u029a\u029a \u0281\u0281\u028a\u0295 \u028b\u0262\u0262\u0262 \u029b\u029c\u028d\u028d\u0277\u0277\u026b\u026c\u0278\u0283\u0283 \u027a\u027a \u0292\u0297\u0297\u0285\u029d\u029e\u021d\u021e\u021e\u021e\u0216\u020d \u0291\u0291\u0291\u0291\u0291\u0291\u0291 \u027d\u027d \u026d\u01d8\u01d8\u01d9\u029f\u01ef \u01e2\u01e2 \u02a0\u02a0\u02a0\u02a0\u027e\u028f\u028f\u028f\u028f\u028f\u028f ", + " \u0288 \u0294\u0294 \u0299\u0275\u0275\u027f\u027f\u029a\u029a \u0281\u0281\u028a \u02a1\u02a1\u0262\u0262 \u029b\u029c\u028d \u0277\u0263\u0296\u026c\u0278\u0283\u0283 \u027a \u0292\u0297\u0297\u02a2 \u029e\u029e\u021d\u021d\u021e\u021e\u0216\u0216\u020d \u02a3 \u0291\u0291\u0291\u0291\u0291\u0291\u0291 \u027d\u027d \u026d\u01d8\u01d9\u01ef\u01ef \u02a4\u02a0\u02a0\u02a0\u02a5\u02a5\u02a5\u02a6\u02a6\u028f ", + " \u0288 \u0294\u0299\u0299\u0275\u027f\u027f\u027f\u029a \u0281\u0281\u028a \u02a7\u02a8\u02a8\u02a8 \u029b\u029c\u028d \u0277\u0263\u026b\u026c\u0279\u0283\u0274\u027a\u027a \u0292\u0297\u0297 \u02a9\u029e \u021d\u02aa\u021e\u021e\u0216\u020d \u02a3 \u02ab\u0291\u0291\u0291\u0291\u0291\u0291\u027d\u027d \u01d8\u01ee\u01d9\u029f \u02a4\u02a4\u02a4\u02a4\u02a5\u02a5\u02a5\u02a5\u02a5\u02ac\u02ac ", + "\u0288\u0288 \u0299\u0299\u0275\u0275\u027f\u027f\u029a \u0281\u028a \u02ad\u02ad \u02a8\u02ae \u029c\u028d\u028d\u02ae\u0277\u026b\u0273\u026c\u0279\u0283\u0274\u027a\u027a \u0292\u0297 \u02a9\u02a9 \u021d\u021d\u021e\u021e\u0216\u0216\u020d \u02a3 \u02ab \u027d\u027d \u026d\u02af\u02b0\u02b1\u02b2\u02b2\u02b2\u02a4\u02a5\u02a5\u02a5 \u02ac\u02ac ", + "\u0288 \u0299\u0299\u0275\u0275\u027f\u027f\u029a\u02b3 \u02b4\u02b5 \u02a7\u02ad\u02ad \u02ae \u029b\u029c\u028d\u028d\u0277\u0277\u0263\u026b\u0278\u0279\u0283\u0274\u027a\u027a \u0292\u0292\u0297 \u02a9\u02a9\u029e \u021d\u021d\u021e\u021e\u0216\u020d\u02b6 \u02a3 \u02ab \u027d \u026d\u02b2\u02b2\u02b7\u02b7\u02b7\u02b8 \u02ac\u02ac\u02ac\u02ac ", + " \u0299\u0275\u0275\u027f\u027f\u029a\u02b3\u02b3 \u02b4\u02b5 \u02a7\u02ad \u02b9\u02ae \u029b\u029c\u028d\u028d\u0277\u0263\u026b\u0273\u0278\u0283\u0283\u0274\u027a\u027a \u0292\u0292\u0297 \u02a9\u02a9 \u029e \u02aa\u021d\u021e\u021e\u0216\u0216\u02ba \u02a3\u02a3 \u02ab \u027d \u02b2\u02b2\u02b7\u02b7\u02b7\u02b7\u01da\u02bb\u02bb \u02ac\u02ac\u02ac\u02ac\u02ac ", + " \u0299\u0299\u0275\u027f\u027f\u029a\u02b3\u02b3 \u02b4\u02b4 \u02ad\u02ad \u02b9\u02b9 \u02ae \u029b\u029c\u028d\u02ae\u0277\u0277\u0296\u0273\u0278\u0283\u0283 \u027a \u0292\u0292\u0297 \u02a9\u02a9 \u029e \u021d\u02bc\u021e\u021e\u0216\u02ba\u02b6 \u02a3 \u02ab \u02bd\u02b2\u02b7\u02b7\u02b7\u02af\u02b1\u01da\u01da \u02ac\u02ac\u02ac\u02ac\u02ac ", + " \u0299\u0299\u0275\u027f\u027f\u027f\u029a\u02b3 \u02be\u02bf \u02a7\u02ad \u02b9\u02b9 \u02ae \u029b\u029c\u028d\u02ae\u0277\u0263\u026b\u026c\u0278\u0283\u0283\u027a\u027a \u0292\u0297\u0297 \u02a9\u02a9 \u029e \u02bc\u021e\u021e\u0216\u0216\u02b6 \u02a3 \u02ab \u02bd\u02bd\u02bd\u02c0\u02b7 \u026d\u02af\u02b1\u01da\u01da \u02c1\u02c2 \u02ac\u02ac\u02ac\u02ac\u02ac ", + " \u0299\u0299\u0275\u027f\u027f\u027f\u029a\u02b3 \u02bf \u02a7\u02ad \u02b9\u02b9 \u02ae\u02ae \u029b\u029c\u028d\u02ae\u0277\u026b\u026b\u026c\u0279\u0283\u0274\u027a\u027a \u0292\u0292\u0297 \u02a9\u02a9 \u029e\u029e \u02bc\u02bc\u021e\u021e\u0216\u02ba \u02a3 \u02ab \u02bd\u02bd\u02c0\u02c0 \u02af\u02b0\u02b1\u01da\u01da \u02c2\u02c2 \u02ac\u02ac\u02ac\u02ac ", + " \u0299\u0275\u0275\u027f\u027f\u029a\u02b3 \u02be\u02bf\u02a7\u02ad \u02b9 \u02ae\u02ae \u02c3\u02c3 \u029b\u029c\u028d\u028d\u0277\u0277\u0263\u0296\u0278\u0279\u0283\u0274\u027a\u027a \u0292\u0292\u0297 \u02a9\u02a9 \u029e \u02bc\u021e\u021e\u0216\u02ba \u02a3 \u02ab \u02bd\u02bd\u02bd\u02c0\u02c0 \u02af\u02af\u02b1\u01da\u01da \u02c2 \u02ac\u02ac\u02ac\u02ac ", + " \u0299\u0299\u0275\u027f\u027f\u029a\u02b3\u02b3 \u02be\u02bf\u02a7\u02ad \u02b9 \u02ae\u02c3\u02c3 \u029b\u029c\u028d\u028d\u0277\u0263\u026b\u0273\u0278\u0279\u0283\u0274\u027a\u027a \u0292\u0297\u0297 \u02a9\u02a9 \u02c4\u02c4\u02c4\u02c4\u02c4 \u02bc\u021e\u021e\u0216 \u02a3 \u02ab \u02bd\u02bd\u02bd\u02c0\u02c0 \u026d\u02b0\u02b1\u01da \u02c2 \u02ac\u02ac\u02ac\u02ac", + "\u02c5\u02c5 \u0299\u0299\u0275\u027f\u027f\u029a\u029a\u02b3 \u02be\u02bf\u02a7\u02ad \u02b9 \u02ae \u029b\u029c\u028d\u028d\u0277\u0277\u0263\u0273\u0278\u0279\u0283\u0274\u027a \u0292\u0297 \u02a9 \u02c4\u02c4 \u02c4\u02c4 \u02bc\u021e\u021e\u0216\u02b6 \u02a3\u02a3\u02a3\u02a3\u02a3\u02a3\u02a3 \u02ab \u02bd\u02bd\u02c6\u02c0\u02c7 \u026d\u02af\u02b1\u02b1\u01da \u02c2 \u02ac", + " \u02c5\u0299\u0299\u0275\u027f\u027f\u027f\u029a\u02b3 \u02bf \u02ad \u02b9\u02b9 \u02ae\u02ae \u029b\u029c\u028d\u02ae\u0277\u0263\u0296\u026c\u0278\u0283\u0283\u0274\u027a \u0292\u0292\u0297 \u02a9\u02c8 \u02c4\u02c4\u02c4 \u02c4 \u02bc\u021e\u02ba\u02ba \u02a3\u02a3\u02a3\u02a3\u02a3\u02bd\u02bd\u02bd\u02c6\u02c6 \u02c7\u02c7 \u026d\u02b0\u02b0 \u01da \u02c2 ", + " \u0299\u0299\u0275\u0275\u027f\u027f\u029a\u02b3 \u02bf\u02bf\u02ad\u02ad \u02b9\u02b9 \u02ae\u02ae\u02ae\u029b\u029c\u028d\u02ae\u0277\u0263\u026b\u026c\u0279\u0283\u0283\u027a\u027a \u0292\u0292 \u02c9\u02c9 \u02ca\u02ca\u02c4\u02c4 \u02c4 \u02bc\u02bc\u02ba\u02cb \u02cc\u02cc\u02bd\u02c6\u02c6 \u02cd\u02c7\u02ce\u02ce \u026d\u02af\u02b1 \u01da \u02c2\u02c2 ", + " \u0299\u0299\u0275\u027f\u027f\u029a\u02b3\u02b3 \u02bf\u02bf\u02a7\u02ad \u02b9\u02b9 \u029b\u028d\u028d\u02ae\u0277\u0263\u0296\u026c\u0278\u0283\u0283\u027a\u027a \u0292\u02cf \u02c9 \u02ca \u02c4 \u02c4\u02d0\u02d0\u02ba \u02cc\u02cc\u02d1\u02d1 \u02cd\u02cd\u02cd \u02c7 \u02ce \u026d\u02b0\u02b1\u01da\u01da \u02c2\u02c2 ", + "\u0299\u0299\u0275\u027f\u027f\u029a\u029a\u02b3 \u02be\u02bf\u02a7\u02ad \u02b9\u02b9 \u029c\u028d\u028d\u0277\u0277\u02d2\u026b\u026c\u0279\u0283\u0274\u027a\u027a \u0292\u02d3\u02cf \u02c9 \u02c4\u02c4 \u02c4\u02c4\u02c4\u02bc\u02bc\u02ba\u02b6 \u02cc\u02cc\u02c6\u02c6\u02d4 \u02c7\u02ce\u02ce \u02af\u02af\u02b1\u01da\u01da \u02c2 ", + "\u0299\u0275\u027f\u027f\u027f\u029a\u02b3 \u02bf\u02a7\u02ad \u02b9\u02b9 \u029c\u028d\u028d\u0277\u0277\u02d2\u0273\u0278\u0279\u0283\u0274\u027a\u027a \u0292\u0292\u02cf \u02d5\u02d5\u02c9 \u02c4\u02c4\u02c4 \u02d6\u02bc\u02bc\u02ba \u02cc\u02cc\u02c6\u02c6 \u02d4 \u02c7\u02c7\u02ce\u02ce \u026d\u02b0\u02b1\u01da \u02c2 ", + "\u0275\u027f\u027f\u027f\u029a\u02b3 \u02bf\u02bf\u02ad \u02b9\u02b9 \u02ae\u029c\u028d\u028d\u0277\u0277\u02d2\u02d7\u02d8\u0279\u0283\u0274\u027a \u0292\u02cf \u02d5\u02d5\u02c9 \u02d6\u02bc\u02ba\u02ba \u02cc\u02cc\u02c6\u02c6 \u02d4 \u02c7\u02c7\u02ce \u02af\u02b1\u02b1\u01da \u02c2 ", + "\u0275\u027f\u027f\u029a\u02b3\u02b3 \u02bf\u02bf\u02a7\u02ad \u02b9 \u02ae\u02ae\u029c\u029c\u028d\u02d9\u0277\u02da\u02db\u02d8\u02dc\u0283\u0274\u027a \u0292\u0292\u02cf \u02d5\u02d5 \u02c9 \u02d6\u02bc\u02bc\u02ba\u02b6 \u02cc\u02cc\u02c6\u02c6 \u02d4 \u02c7 \u02ce \u02b0\u02b1 \u01da \u02c2\u02c2 ", + "\u027f\u027f\u029a\u02b3\u02b3 \u02be\u02bf\u02ad\u02ad \u02b9 \u02ae\u02ae \u029c\u028d\u028d\u02d9\u0277\u02d7\u02db\u02dc\u02dd\u02de\u027a\u027a \u0292\u0292\u02cf \u02d5 \u02c9\u02c9 \u02d6\u02bc\u02bc\u02ba\u02b6\u02b6\u02cc\u02cc\u02c6\u02c6 \u02d4 \u02c7 \u02ce \u02af\u02af\u02b1\u01da\u01da \u02c2\u02c2 ", + "\u027f\u029a\u029a\u02b3 \u02be\u02bf\u02a7\u02ad \u02b9 \u02ae \u029c\u028d\u028d\u02d9\u0277\u02d7\u02db\u02dc\u02de\u02de\u027a\u027a \u0292\u0292\u02cf \u02d5 \u02c9 \u02d6\u02d6\u02bc\u02bc\u02ba\u02ba\u02cc\u02cc\u02c6\u02c6\u02df\u02df\u02e0 \u02d4 \u02c7 \u02ce \u02af\u02b0\u02e1\u01da\u01da ", + "\u027f\u029a\u02b3 \u02bf\u02bf\u02ad \u02b9\u02b9 \u02ae \u029c\u028d\u028d\u02d9\u0277\u02db\u02d8\u02dc\u02de \u027a\u027a \u0292\u0292\u02cf \u02d5\u02d5 \u02c9 \u02d6\u02d6\u02bc\u02cb\u02e2\u02cc\u02e3\u02c6 \u02e0\u02e0\u02e0\u02d4\u02d4\u02d4\u02d4\u02d4 \u02c7\u02c7\u02e4\u02ce \u02af\u02b0\u02b1\u01da ", + "\u029a\u02b3 \u02bf\u02bf\u02a7 \u02b9\u02b9 \u02ae\u029c\u028d\u02d9\u02d9\u0277\u02d8\u02db\u02de\u02de \u027a\u027a \u0292\u02e5\u0292 \u02d5\u02d5 \u02c9 \u02e6 \u02d6\u02bc\u02bc\u02e2\u02cb\u02e3\u02c6 \u02d4\u02d4\u02d4\u02d4\u02d4\u02d4\u02d4\u02c7\u02c7\u02e4\u02ce \u02e7\u02b0\u02e8\u01da ", + "\u02b3\u02b3 \u02be\u02bf\u02ad\u02ad \u02b9\u02b9 \u02ae\u02ae\u02d9\u02d9\u0277 \u02d8\u02dd\u02dd \u027a\u027a \u0292\u02e5\u02cf \u02d5\u02d5 \u02c9\u02c9 \u02e6\u02e6 \u02d6\u02e9\u02e9\u02cb\u02ea\u02c6 \u02d4\u02c7\u02e4\u02e4\u02ce \u02af\u02b1\u02e1\u01da ", + "\u02b3 \u02be\u02bf\u02a7\u02ad \u02d9\u0277\u0277 \u02dc\u02dd \u027a\u027a \u02e5\u02e5\u02cf \u02d5\u02d5 \u02c9\u02c9 \u02e6 \u02eb\u02e9\u02e9\u02e9\u02cb\u02cb\u02ec \u02ed\u02c7\u02e4\u02ce\u02ce \u02af\u02e7\u02e8\u02e8\u01da ", + " \u02bf\u02a7\u02ad \u02d9\u0277\u0277 \u02dc\u02ee \u027a\u027a\u0292\u0292\u02cf \u02d5 \u02c9\u02c9 \u02e6 \u02eb\u02eb\u02ef\u02f0\u02f0\u02d6\u02ec\u02ec\u02ec\u02ec \u02ed \u02c7\u02e4\u02ce\u02ce \u02f1\u02f1 \u02af\u02e7\u02b1\u01da\u01da ", + " \u02bf\u02bf\u02a7 \u02d9\u0277\u02f2\u02ee\u02dc \u027a\u0292\u0292\u02cf \u02d5\u02d5 \u02c9\u02c9 \u02e6 \u02eb\u02eb\u02f0\u02f0\u02f3\u02f4\u02f4\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec \u02ed \u02c7\u02c7\u02e4\u02ce\u02ce\u02f1\u02f1 \u02e7\u02b0\u02e8\u01da\u01da ", + " \u02be\u02bf\u02ad \u02d9\u02d9\u0277\u02f2\u02f5\u02ee\u027a\u027a\u0292\u0292\u0292 \u02d5\u02d5 \u02c9 \u02e6 \u02f6\u02eb\u02eb\u02f0 \u02f3\u02f4\u02f4\u02f4\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02f7\u02ec \u02f8\u02e4\u02e4\u02f1\u02f1 \u02af\u02b0\u02e1\u01da\u01da ", + "\u02be\u02bf\u02a7\u02ad \u02d9\u02d9\u0277\u02f2\u02f5\u02f9\u02fa\u02fa\u0292\u0292\u02cf \u02d5\u02d5 \u02c9\u02c9 \u02e6 \u02fb\u02f6\u02eb\u02f0\u02f0 \u02f3\u02f4\u02f4\u02f4\u02f4\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02f7\u02f7\u02ec\u02ec\u02ec\u02ec\u02ec\u02ec\u02f8\u02e4\u02e4\u02ce \u02af\u02af\u02b1\u02e1\u01da\u01da ", + "\u02bf\u02ad\u02ad \u02d9\u0277\u0277\u02f5\u02f5\u02f9\u02fa\u0292\u0292\u02cf \u02d5\u02d5 \u02c9\u02c9 \u02e6 \u02f6\u02f6\u02f6\u02eb\u02f0 \u02f3\u02f3\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f7\u02f4\u02f4\u02ec\u02ec\u02ec\u02ec\u02ec\u02f8\u02ec\u02e4\u02e4\u02ce \u02af\u02af\u02b1\u02e1\u01da ", + "\u02a7\u02ad \u02d9\u0277 \u02f5\u02f5\u02f9\u02fa\u0292\u0292 \u02d5 \u02c9\u02c9 \u02fb \u02f0\u02f0 \u02f3\u02f3\u02f3\u02f3\u02f4\u02f3\u02f3\u02f3\u02f3\u02f3\u02f7\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02f4\u02ec\u02ec\u02f8\u02ec\u02ec\u02e4\u02ce \u02af\u02b0\u02b1 \u01da ", + "\u02ad \u02d9\u02d9\u0277 \u02f9\u02f9\u02fa\u0292\u02cf \u02c9\u02c9 \u02f4\u02f4\u02f4\u02f8\u02ec\u02ec\u02ec\u02ce\u02ce \u02af\u02b0\u02b1 \u01da ", + "\u02ad \u02d9\u02d9\u0277 \u02f9\u02f9\u02fa\u0292\u02cf \u02c9 \u02f8\u02f4\u02ec\u02ec\u02ec\u02ec\u02ce \u02af\u02b1\u02b1\u01da\u01da ", + " \u02d9\u0277\u0277 \u02f9\u02f9\u0292\u0292\u02cf \u02c9\u02c9 \u02f4\u02f4\u02f4\u02ec\u02ec\u02ec\u02ce \u02af\u02af\u02b1\u02b1\u01da\u01da ", + " \u02d9\u02d9\u0277 \u02f9\u02f9\u0292\u0292 \u02c9\u02c9 \u02f4\u02f4\u02ec\u02ec\u02ec\u02ce \u02af\u02b0\u02b1\u02b1\u01da ", + " \u02d9\u02d9\u0277 \u02f9\u02fa\u0292\u02cf \u02c9\u02c9 \u02f4\u02f4\u02ec\u02ec\u02ec\u02ce \u02af\u02b0\u02b1 \u01da ", + " \u02d9\u0277 \u02f9\u02fa\u0292\u02cf \u02c9\u02c9 \u02f4\u02f4\u02ec\u02ec\u02ec\u02ce \u02af\u02b0\u02b1 \u01da ", + " \u02d9 \u02f9\u02f9\u02fa\u0292\u02cf \u02f4\u02ec\u02ec\u02ec\u02ce \u02af \u02b1\u01da\u01da ", + " \u02f9\u02f9\u0292\u0292\u02cf \u02f4\u02ec\u02ec\u02ec\u02ce \u02af\u02b0\u02b1\u02b1\u01da ", + " \u02f9\u02f9\u0292\u0292\u02cf \u02f4\u02ec\u02ec\u02ec\u02ce \u02af\u02b0\u02b1 \u01da " + ] +} \ 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 new file mode 100644 index 000000000..6565f65e9 --- /dev/null +++ b/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-1.0-grid-reference.json @@ -0,0 +1,891 @@ +{ + "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", + "743", + "50", + "92", + "38", + "213", + "847", + "741", + "492", + "841", + "254", + "747", + "827", + "568", + "39", + "53", + "439", + "753", + "224", + "607", + "5", + "61", + "158", + "840", + "438", + "214", + "835", + "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", + "844", + "144", + "125", + "719", + "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", + "767", + "501", + "503", + "142", + "117", + "18", + "28", + "731", + "745", + "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", + "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\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\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\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 ", + " \u0128\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\u0128\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\u0128\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', \u010d\u015c\u015c\u013e\u013e \u013e\u013e\u013e \u0137\u0137\u0137\u0137\u0149\u0149\u0149\u0152\u0152\u0152 \u015f", + "\u015d\u00f8 \u014a\u0127\u0160\u014b \u0118\u0118\u0114\u0114 \u0143\u0144\u0144 \u015e\u015e \u015e \u0112\u0113\u012a\u012a\u012b\u0161\u0161\u0161\u015b\u015b\u015b\u015b \u0162\u0162\u0163\u0163\u0163\u0150\u0150\u0150\u0150\u0121\u0158\u0158\u00fc\u00fc\u0136\u014f\u014f & ',, \u010d\u015c \u013e\u013e \u013e\u013e\u0164\u013e\u013e \u0137\u0137\u0137\u0149\u0149\u0149\u0149\u0152\u0152\u0152 \u015f\u015f\u0165", + " \u015d \u0166\u0128\u0128 \u0118\u0118\u0143\u0143\u0144 \u015e\u015e \u015e\u0167 \u0112\u0113\u012a\u012b\u0161\u0161\u0161\u0161\u0163\u0163\u0163\u0163\u0163\u0163\u0162\u0163\u0163\u0163\u0150\u0150\u0150 \u0158\u0158\u0158\u00fc\u00fc\u0157 \u014f \u0168 \u011d', \u010d\u010d \u013e\u013e \u013e\u0164\u0164\u0164\u013e\u013e\u013e \u0169\u0169\u0169\u0137\u0137\u0137\u0137\u0149\u0149\u0149\u0149 \u0152\u0152\u0152 \u015f\u0165\u0165\u016a\u016b", + "\u016c \u015d\u015d \u0127\u0160\u0128 \u0118\u0143\u0144 \u015e \u0167\u0167 \u0112\u0113\u012a\u012b\u0161\u0161\u0161\u016d\u016d\u016d\u016d\u016d\u016d\u016d\u016d\u0162\u016d\u0163\u0163 \u016e\u0158\u00fc\u00fc\u0136\u0156\u0157\u014f\u014f \u0168\u00dc\u011d',\u016f \u010d\u010d \u013e\u013e \u013e \u0164\u0164\u0169\u0169\u0169\u0169\u0169\u0169\u0169\u0169\u0169\u0137\u0170\u0137\u0149\u0149\u0149\u0149\u0171\u0171 \u0152\u0152 \u015f\u0165\u0165\u016a\u016b\u016b ", + "\u0172\u016c \u015d\u015d \u014a\u0127\u0128\u014b \u0143\u0144 \u015e \u0112\u0113\u012a\u012a\u0161\u0161\u016d\u016d\u016d\u016d\u016d\u0173\u0173\u0173\u016d\u016d\u0162\u016d\u016d\u016d \u016e\u0174\u0174\u0136\u0175\u0175\u0156\u0157\u014f \u0176\u00dc\u011d\u00cd ,\u016f \u0177\u0177\u010d\u010d \u013e\u013e\u0178 \u0169 \u0179\u0137\u0170\u0170\u0149\u0149\u0149 \u017a\u0171 \u0152\u0152 \u015f\u0165\u0165\u016a\u016b\u016b ", + "\u0172\u016c\u016c \u017b\u015d \u014a\u0127\u0128\u0128 \u0143\u0144\u0144 \u015e \u0112\u0113\u012a\u012a\u0161\u0161\u016d\u016d\u016d\u0173\u0173\u0173\u0173\u0173\u0173\u0173\u0173\u0162\u016d\u016d\u016d\u016d\u016d \u016e\u016e\u0174\u0174\u017c\u017d\u0175\u0175\u0157\u014f \u0168\u00dc \u011d',\u016f\u016f\u0177\u0177 \u0177\u0177\u0177\u010d \u0178\u0178\u0178 \u0169 \u0179\u0179\u0179\u0170\u017e\u0149\u0149 \u017a\u017a\u017a\u0171 \u0152 \u015f\u0165\u0165\u0165\u016a\u016b\u016b ", + "\u0172 \u016c\u016c\u017b \u015d \u0127\u0128\u0128 \u0143\u0143\u0144 \u015e\u015e \u0112\u0112\u0113\u012a\u0161\u0161\u016d\u016d\u0173\u0173 \u017f\u017f \u0162\u0173\u0173\u016d\u016d\u016d\u016d\u0180\u0180\u0181\u017c\u017c\u017d\u017d\u0175\u0156\u014f \u0168\u00dc \u011d',,\u016f\u0177 \u010d\u010d \u0169\u0169\u0169\u0179\u0179\u0179\u0182\u0170\u0183\u017e \u017a\u017a\u017a \u0171 \u0152 \u015f\u0165\u0165\u0184\u016a\u016b\u016b \u0185\u0185", + "\u0172\u016c\u016c\u017b\u017b \u015d\u015d \u014a\u0127\u0128\u014b \u0143\u0143\u0144 \u015e\u015e \u0112\u0113\u012a\u0161\u0161\u0161\u016d\u0173\u0173 \u017f \u017f\u017f\u017f\u017f \u0186\u0186\u0173\u0187\u0187\u016d\u016d\u0180\u0180\u0181\u017c\u017c\u017d\u017d\u0175\u0175\u0157\u014f \u0176\u00dc \u011d', \u016f \u010d\u010d \u0169\u0169\u0169\u0179\u0179\u0179\u0182\u017e\u017e\u0183 \u017a\u017a\u017a \u0171\u0171 \u0152 \u015f\u0165\u0165\u016a\u016a\u016b\u016b \u0185\u0185\u0185 ", + " \u016c\u017b\u017b \u015d\u015d \u014a\u0127\u0128\u014b\u0143\u0144 \u0188\u0189 \u0112\u0113\u012a\u012a\u0161\u0161\u016d\u0173\u0173 \u017f\u017f\u018a \u017f\u017f\u018b\u0186\u018b\u0187\u0187 \u016d\u0180\u0181\u0181\u017c\u017c \u017d\u017d\u0175\u0157\u014f \u0176\u00dc \u011d',, \u016f \u010d\u010d\u0169\u0179\u0179\u0179\u0182\u0182\u017e\u017e\u0183 \u017a\u017a \u018c\u018c\u0171 \u0152 \u015f\u0165\u0165\u016a\u016a\u016b\u016b \u0185\u0185 ", + "\u016c \u017b\u018d \u015d\u015d \u0127\u014b\u014b\u0144 \u0188 \u0189 \u0113\u012a\u012a\u0161\u0161\u016d\u0173\u0173 \u017f\u017f \u018a\u018a\u018a\u018a\u018a \u018e\u0186\u018b\u0187\u0187\u0187\u0180\u0180\u0181\u0181\u017c\u017c \u017d\u017d\u0175\u0157\u014f\u018f\u0176\u00dc\u0190\u0191\u011d\u00cd', \u016f \u0192\u0179\u0179\u0182\u0170\u017e\u017e\u0183 \u017a\u017a\u017a \u018c\u018c\u018c\u0171\u0171\u0152 \u015f\u0165\u0165\u016a\u016b\u016b\u016b \u0185\u0185 ", + " \u0193 \u015d\u015d \u0143\u014a\u0144 \u0194 \u0189 \u0113\u0113\u012a\u0161\u0161\u016d\u016d\u0173 \u017f\u017f \u0195\u0195 \u018a\u018a\u018a\u017f\u0186\u0186\u018b\u0187\u0187\u0180\u0180\u0181\u016d\u017c\u017c\u017c\u017d\u017d\u0175\u018f \u0176\u0196 \u0191\u0191\u011d',, \u016f \u0179\u0179 \u0182\u0170\u0197\u017e\u0183 \u017a\u017a\u017a \u018c\u018c \u0171\u0152\u0152 \u015f\u0165\u0184\u016a\u016b\u016b\u016b \u0185\u0185 ", + "\u017b \u015d\u015d \u0143\u0143\u0144 \u0194\u0194\u0189\u0189 \u0113\u012a\u0161\u0161\u0161\u016d\u0173\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 \u0176\u0196 \u0191\u011d\u00cd', \u016f\u016f \u0179\u0179 \u019b\u0170\u0197\u017e\u0183\u0192 \u0171\u0171\u0171\u0171\u018c\u018c\u018c \u0171 \u0152 \u0165\u0165\u0184\u016a\u016b\u016b \u0185\u0185 ", + "\u019c \u019d\u019d\u015d \u0143\u0144 \u019e\u019e\u019e\u019e\u019e \u0113\u012a\u012a\u0161\u0161\u016d\u0173\u0198\u0198\u0198 \u0195\u0195\u0195\u0195 \u0186\u018b\u018b\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u017d\u0199\u019a \u0176\u00dc \u0191 \u011d',, \u016f \u0179\u0179 \u0182\u0170\u017e\u017e\u0183\u0183 \u01a1\u01a1 \u0171\u0171\u0171\u0171\u01a2\u01a2\u0171\u0171\u0152 \u015f\u015f\u0165\u01a3\u016a\u016b\u016b \u0185\u0185 ", + " \u019d \u015d \u0143\u0144\u0144 \u019e\u019e\u01a4\u01a4\u01a4\u01a4 \u0113\u012a\u012a\u0161\u0161\u016d\u016d\u0198\u0198\u0198 \u0195 \u0186\u0186\u018b\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u017d\u0199\u019a \u0176 \u0196 \u01a5\u011d\u00cd',\u01a6\u0179\u0179 \u0182\u0170\u017e\u017e\u0183\u0183 \u01a2\u01a2 \u0152\u0152 \u015f\u0165\u0165\u01a3\u016a\u016b\u016b \u0185\u0185 ", + " \u01a7 \u019d \u015d\u015d\u0143\u0144\u0144 \u01a4\u01a4\u01a4\u01a4\u01a4\u01a4\u01a4\u01a4 \u0113\u012a\u012a\u0161\u0161\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 \u0176 \u0196 \u011d\u01ab\u01a6\u01a6 \u0182\u0170\u017e\u017e \u0183\u0183 \u01a2\u01a2 \u0152 \u015f\u0165\u0165\u01a3\u016b\u016b\u016b \u0185\u0185 ", + " \u01a7\u01a7\u01ac\u01ac\u01ac \u015d\u0143\u0144 \u01a4\u01a4\u01a4 \u01a4\u01a4 \u0113\u012a\u0161\u0161\u0161\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 \u0176 \u0196\u00dc \u01b0\u0179\u01ab\u01a6\u0182\u017e\u017e \u0183\u0183 \u01a2\u01a2 \u0152 \u015f\u0165\u01a3\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\u0161\u0161\u01b7\u0198\u0198 \u01b8\u01a9 \u01ad\u01ad \u01a9\u01ae\u01ae \u01af\u0186\u0186\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u0199 \u0176\u0176 \u0196\u00dc \u0179\u0179\u01b0\u01b9\u0182\u01a6\u01a6 \u0183\u0183 \u01a2\u01a2\u01a2\u01a2\u01a2 \u01ba\u0152\u015f\u0165\u0184\u01b1\u016a\u016b\u016b \u0185\u0185 ", + "\u01b3\u01b2\u01b2 \u01bb\u01bb \u01ac \u01bc\u01bd\u01b4\u019e\u01a4\u01a4\u01b6\u01b6 \u01b6 \u01be\u0113\u012a\u012a\u01bf\u0161\u01c0\u01b7\u01b7 \u01a9\u01b8\u01b8\u01b8 \u01ad\u01ad \u01a9 \u01af\u0186\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u0199\u0199 \u0176 \u01c1\u01c2\u01c3\u0179 \u0182\u0182\u017e\u01b0\u01ab\u01a6\u0183\u0183 \u01a2\u01a2\u01a2\u01a2 \u01a2\u01a2\u01a2 \u015f\u015f\u0165\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 \u0176\u0176 \u01c3\u01c2\u01c2\u01ce\u0182\u017e\u017e\u01b0\u01b9\u01ab\u01a6\u01a6 \u01a2\u01a2 \u01a2\u01a2\u015f\u01ba\u0165\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 \u0176\u0176 \u01c3\u01c3\u01d4\u01c2\u01d5\u01d6\u017e \u0183\u0183\u01b0\u01d7\u01ab\u01d8 \u01a2\u01a2 \u01a2\u015f\u015f\u01d9\u0165\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\u01da\u01da\u01a9\u01a9\u01d2\u01d2 \u01cd\u01cd \u01b8\u01b8 \u01a9 \u01af \u0186\u0186\u019f\u01a0\u01d3\u01d3\u016d\u0199\u01db\u0176\u0176\u01c3\u01c3\u01d4\u01d5\u01d5\u01c2\u01d6 \u0183\u0183\u0183 \u01d7\u01dc\u01d8\u01d8\u01a2\u01a2\u01a2\u01a2\u01a2 \u01a2\u015f\u01d9\u01d9\u0165\u016a\u016b\u016b \u01dd\u01dd \u0185\u0185 ", + " \u016c \u01c5\u01de\u019d \u01ac \u01c7\u01d0\u01df\u01e0\u01df\u01d1\u01d1\u01d1 \u0113\u012a\u012a\u01bf\u01bf\u01bf\u01b7\u01b7 \u01da\u01e1\u01e1 \u01d2\u01d2 \u01cd\u01cd \u01b8\u01b8\u01a9 \u01af \u0186\u019f\u01d3\u01d3\u016d\u016d\u01db\u01db\u0176\u01c3\u01d4\u01e2\u01d5\u01d5\u01e3\u01c2\u0183\u0183\u0183 \u01d7\u01dc\u01d8\u01a2 \u01a2\u01d9\u01d9\u0165\u0165\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\u01da\u01e1\u01e1 \u01d2\u01d2 \u01cd\u01cd\u01a9\u01a9 \u01af \u01d3\u01d3\u01d3\u01a0\u01eb\u01eb\u0176\u01c3\u01ec\u01e2\u01ed\u01ee\u01ef\u01f0\u0183\u01c1\u0183 \u01d7\u01f1\u01dc\u01d8\u01a2 \u01a2\u015f\u0165\u0165\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\u01da\u01da \u01e1\u01e1 \u01d2\u01d2\u01a9\u01a9\u01cd\u01a9 \u01af\u01f7\u01f7\u01d3\u01d3\u01f8\u01f9\u0176\u01c3\u01ec\u01db\u01ed\u01ee\u01e3\u01f0\u0183\u0183\u0183\u01c2\u01c2 \u01f1\u01dc\u01d8\u01d8 \u01a2\u015f\u0165\u0165\u016a\u016b\u016b\u016b \u01f2 \u01fa\u01f3\u01f3\u01f3 \u01fb\u01dd\u01dd \u01e5 ", + " \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\u01da \u01a9\u01a9\u01e1\u01a9\u01a9\u01a9 \u01f7\u01f7\u01f7\u01f7\u01f7\u01fe\u0176\u01c3\u01ec\u01f9\u01db\u01db\u01f0\u01ef\u0183\u0183\u0183 \u01ff \u01d7\u01d7\u01dc\u01d8\u01a2 \u01a2\u01a2\u015f\u0165\u0165\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\u0173\u01e8\u01e8\u01e8 \u01f6\u01e8\u01e8\u01e8\u01da\u01e8 \u0202\u0202\u01f7\u01f7\u01f7\u01f7 \u0176\u01c3\u01fe\u01ec\u01d5\u01d5\u01f0\u01db\u01ef\u0183\u0183 \u01ff\u0203 \u01d7\u01f1\u01dc\u01d8\u0204\u0204\u0165\u0165\u016a\u016b\u016b \u01f2 \u01fa\u01fa \u01e5 ", + "\u0176 \u01e6\u01e6\u01e6 \u01fc\u01ac \u01c7\u01d0 \u0201 \u0205\u0206\u0207\u01df\u01df\u012a\u012a\u01bf\u01bf\u01bf\u0173\u0173 \u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01da\u01da \u0202\u0202\u0202\u0202\u0202\u0208\u0208\u0208\u0208\u01f7 \u0176\u0176\u01c3\u01ec\u01d5\u01d5\u01e3\u01f9\u01ef\u01ef\u0183 \u0209\u0209 \u01ff\u0203 \u01d7\u01f1\u01dc\u020a\u020b\u016a\u016b\u016b \u01f2 \u01dd\u01dd \u01e5 ", + "\u0176\u0176 \u020c\u01e6\u01e6\u01e6 \u01fc\u01fc\u01fc \u01c7\u01d0\u0201\u0201\u0205 \u0206\u020d\u01df\u012a\u012a\u012b\u01bf\u01bf\u01c0\u0173 \u01e8\u01e8\u01e8\u01e8\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0208\u0208\u0208\u0208\u0208\u0208\u0208 \u0176\u0176\u01c3\u01ec\u01d5\u01d5\u01fe\u01e3\u01f8\u01ef\u01f9\u01db\u020e \u0209\u0209\u020f \u01ff\u0203 \u0210\u0211\u020a\u020b\u0212\u0212\u016b \u01f2\u01dd \u01dd\u01dd \u01e5 ", + "\u0213\u0176\u0176 \u0214\u0215\u01e6\u01e6\u0216\u0216 \u01fc\u01fc\u01fc \u01c7\u01d0\u0201\u0201\u0205 \u0206 \u020d\u012a\u012a\u012b\u01bf\u01bf\u01bf\u0173 \u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0217\u0202\u0202\u0202\u0202\u0202\u0202\u0208\u0208\u0208\u0208\u0208\u0208\u0208 \u0176\u0176\u01c3\u01ec\u01d5\u0170\u0170\u01e3 \u01fe\u01f8\u01f8\u0218\u0219\u020e\u0209\u0209 \u020f \u01ff\u0203 \u0210\u0210\u0211\u021a\u021b\u0212\u0212\u01dc\u01d8 \u01f2 \u01dd\u01dd \u01e5 ", + "\u0213\u01c3\u01c3\u0176\u0214 \u0215\u0215\u021c\u0216\u0216\u0216\u0216 \u01fc\u01fc\u01fc\u01c7\u01d0\u0201\u0205\u0205\u0206 \u020d \u012a\u012b\u01bf\u01bf\u01bf\u0173 \u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u021d\u0217\u0217 \u0208\u0208\u0208\u0208\u0208 \u0176\u0176\u01c3\u01ec\u01d5\u0170\u0170\u01e3 \u0183\u0183\u01fe\u021e\u021f\u021f\u0218\u020e\u020e \u01ff\u0203 \u0210\u0211\u0211\u0220\u021a\u0221\u0221\u0212\u01d7\u01f1\u01dc\u01d8 \u01f2 \u0222\u0222\u0222 \u01e5 ", + "\u0223\u0213\u0213\u01c3\u0176\u0176 \u0215\u0215 \u021c\u0216\u0216\u0216\u0216 \u01c7\u01fc\u020d\u020d\u0205\u0206\u0206\u020d \u012a\u012a\u01bf\u01bf\u01bf\u0173\u0202\u0202\u0202\u0202\u0202\u0224\u0225\u0225\u0226\u021d\u021d\u021d\u0217\u0217 \u0208\u0208\u0208\u0208\u0208 \u0176\u0176\u01c3\u01ec\u0227\u0170\u01d5\u01e3 \u0183\u0183 \u021e\u021f\u021f\u0218\u0218\u020e\u019a \u01ff\u0203 \u0210\u0211\u0211\u0220\u0221\u0221\u0221\u0228\u0228\u0228 \u01f1\u01f1\u01dc\u01d8 \u01f2 \u0229 \u0222\u0222\u0222\u0222\u0222\u0222\u0222\u0222\u0222\u0222 ", + "\u022a\u0223\u0213\u0214\u0214\u0176\u0176 \u0215\u0215\u022b\u021c\u021c\u0216\u0216\u0216\u0216 \u020d\u0206\u020d \u012a\u012a\u012b\u01bf\u01bf\u01c0\u0202\u0202\u0202\u0202\u0202\u022c\u0224 \u021d\u021d\u021d\u022d\u022e \u0217\u0217\u0208\u0208\u0208 \u0176\u01c3\u01c3\u01ec\u0227\u01d5\u0170\u01e3 \u0183\u0183 \u021e\u021e\u021f\u021f\u0218\u020e\u020e \u01ff\u0203 \u0210\u0211\u0211\u0220\u0221\u0221\u0221 \u022f \u0228 \u01d7\u01f1\u01dc\u01d8 \u01f2 \u0229 \u01e5\u0230\u0230\u0230\u0230\u0230 ", + " \u022a\u022a\u0223\u0213\u0214\u01c3\u0176\u0176 \u0231 \u021c\u021c\u0216\u0216\u0216\u0216 \u020d\u012a\u012a\u012b\u01bf\u01bf\u01bf\u0202\u0202\u0202\u0232\u0233\u0233\u022c\u021d\u021d\u0225\u0225\u0226 \u022d\u022e \u0217\u0217\u0208 \u0176\u01c3\u01c3\u01ec\u01ec\u01d5\u0170\u01e3\u01e3\u0183\u0183 \u021e\u021f\u021f\u0218\u0218\u020e\u019a \u01ff\u0234\u0211\u0211\u0220\u0221\u0221\u0221 \u0235\u022f \u0228 \u01f1\u01f1\u01dc\u01d8 \u01f2 \u0229 \u01e5 \u0230\u0230\u0230\u0230\u0230\u0230 ", + "\u0236\u0236 \u022a\u0223\u0213\u0213 \u01c3\u0176\u0231\u0231 \u021c\u021c\u0216\u0216\u0216\u0216\u012a\u012b\u01bf\u01bf\u01bf\u0202\u0202\u0202 \u0232 \u021d\u021d\u022c\u0224 \u0225\u0226\u0226\u022d\u022e\u0237 \u0176\u01c3\u01c3\u01ec\u01ec\u01d5\u01d5\u0170\u01e3\u0183\u0183 \u021e\u021e\u021f\u021f\u0218\u020e\u020e\u0238\u0239\u0239\u023a\u023a\u0220\u0221\u0221\u0221 \u023b \u0235 \u022f \u023c\u023c\u0228 \u01d7\u01f1\u01dc\u01d8 \u01f2 \u0229 \u01e5 ", + " \u0236\u0236 \u022a\u0223\u0213\u0213\u0231\u01c3\u0176\u0176\u0176 \u021c\u021c\u021c\u0216\u0216\u01bf\u01bf\u01bf\u0202\u0202\u0202 \u023d\u021d\u021d\u0233 \u022c \u0224\u0225 \u0226\u0237 \u0176\u01c3\u01c3\u01ec\u01ec\u01d5\u01d5\u01e3\u01e3\u0183\u0183 \u023e\u021e\u021f\u021f\u0218\u0218\u0238\u0238\u023f\u0240\u0241\u0242\u0221\u0221 \u023b\u023b \u0235 \u0243\u022f\u023c \u0228\u0228 \u01f1\u01f1\u01dc\u01d8 \u01f2 \u0229 \u01e5 ", + " \u0236\u0236 \u022a\u0223\u0231\u0213 \u01c3\u01c3\u0176\u0176 \u021c\u012a \u0244\u0244\u0202\u0202\u0202 \u023d\u0232 \u0233\u022c\u022c\u0224\u0237\u0225 \u0176\u0176\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\u01dc\u01d8 \u01f2 \u0229 \u01e5 ", + "\u0249\u0249\u0249\u0249\u0249\u0236\u0236 \u022a\u0223\u0223\u0213\u0213\u01c3\u01c3\u0176\u0176\u0176 \u024a \u0244\u0244\u0173\u0202\u0202 \u023d \u0232\u0233 \u022c\u0237 \u0176\u0176\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\u01dc\u01d8 \u01f2 \u0229 \u01e5 ", + " \u0236\u0236\u0252 \u022a\u022a\u0223\u0213\u0213\u0213\u01c3\u0176\u0176\u0176\u0253\u0254\u0244\u0244\u0202\u0202 \u023d\u0232\u0237\u0233 \u0176\u0176\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\u01dc\u01d8 \u01f2\u01f2 \u0229 \u01e5 ", + "\u025a \u025b\u025b\u025b \u025c\u025d\u025d\u025d \u022a\u022a\u022a\u0213\u0213\u0253\u01c3\u0176\u0254\u025e\u025e\u025f\u0202 \u0260\u0260 \u023d\u0237 \u0176\u0176\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\u0218\u020e\u0263\u0264\u023b \u0259\u0259\u0259\u0259\u0259\u024f \u0251 \u01d7\u01f1\u01dc\u01d8 \u01f2 \u0229\u0229 \u01e5 ", + "\u025a\u025a\u025b\u025b\u025b \u025c\u0265 \u025d\u025d\u025d \u022a\u022a\u0223\u0223\u0254\u0213\u0213\u01c3\u0176 \u0260\u0260\u0260\u0260 \u0176\u0176\u0176\u01c3\u01ec\u01ec\u01ec\u01e3\u01e3 \u0183\u0183\u0183 \u0255\u0255\u0255\u0255 \u024b\u0223\u0223\u0223\u0266\u0267\u0268\u0262\u0262\u0258\u021f\u0218\u0269\u0263\u020e\u026a \u024f \u0251\u0251 \u01f1 \u01d8\u01d8 \u01f2 \u0229\u0229 \u01e5 ", + " \u026b\u025a \u025c\u026c \u026d\u026e \u0253\u0253\u0254\u022a\u025e\u022a\u0213\u0183\u01c3\u0176\u0176\u01c3\u0176\u0176\u0176\u0176\u01c3\u0176\u01c3\u01c3\u01ec\u01ec\u01e3\u01e3\u01e3 \u0183\u0183\u0183 \u0255\u0255\u0255\u0255 \u0223\u0223\u022a\u0223\u0266\u0266\u026f\u0267\u0270\u0271\u0258\u021e\u021f\u021f\u0218\u0263\u0264\u020e\u026a\u026a\u026a\u026a \u0272\u0272\u0272\u0272\u0272 \u0273 \u0251\u0251 \u01d7\u01d7 \u01d8\u01d8\u01f2\u01f2 \u0229 \u01e5 ", + "\u026b \u025a\u025a \u0265\u0265\u026c \u0274 \u0275\u0275\u0254\u025e\u025e\u025e\u025f\u022a\u022a\u022a\u0223\u0183\u0183\u0183 \u01ec\u01ec\u0276\u01e3\u01e3\u0183\u0183\u0183 \u0255\u0255\u0255 \u0223\u0223\u0223\u0223\u022a\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 \u01e5 ", + "\u026b \u025a\u025a \u0265 \u026c \u0274 \u0275\u0275\u027a\u027a\u025e\u025e\u025f\u025f \u022a\u0223\u0223\u022a\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u027b\u027b\u027b\u0255\u0255 \u0223\u0223\u0223\u0223\u0223\u022a\u0266\u0266\u0266\u0266 \u0277\u027c\u0267\u0270\u027d\u0271\u027e \u027f\u021e\u021e\u021f\u0264\u0218\u0269\u020e\u020e \u0272\u0272\u0272 \u0280\u0280\u0280\u0280\u0280\u0280\u0280\u0280\u0280 \u0273 \u0272\u0272\u0272 \u01d7\u01d7\u01dc\u01d8\u01f2\u01f2 \u0229 \u01e5 \u0281", + " \u025a\u025a\u0265 \u026c \u0274 \u0275\u0275\u027a\u027a\u0282\u0282\u025f\u025f\u0283 \u0284\u022a\u0276\u022a\u0223\u0223\u0223\u0223\u0223\u027b\u027b\u0223\u0223\u0223\u0223\u0223\u022a\u0223\u0223\u0223\u022a\u022a\u0266\u0266\u0266\u0266\u0266 \u0285\u0285\u0277\u027c\u027c\u0270\u027d\u027e\u0286\u0279 \u027f \u021e\u0263\u0264\u0218\u0218\u0269\u0287\u0272\u0288\u0289\u028a\u028a\u0280 \u0280\u0280\u0280\u0280 \u0272\u0272 \u01d7\u01f1\u01dc\u01d8\u01f2 \u0229\u0229 \u01e5 \u0281\u0281\u0281\u0281\u0281", + " \u028b\u025a \u026c \u0274 \u0275\u027a\u027a\u0282\u0282\u028c\u028c \u0283 \u0284\u0284\u028d\u028d\u028d \u028e\u028e\u027b\u027b\u027b\u022a\u022a\u0266\u0266\u0266\u0266\u0266\u0266\u0266\u0266 \u0285\u028f\u0290\u0277\u027c\u0267\u0278\u027d\u027e\u0286\u0279 \u027f \u0263\u0264\u021f\u021f\u0287\u0291\u0291\u0288\u0292 \u028a \u0280\u0280\u0280 \u0272\u0272 \u01d7\u01f1\u01dc\u01f2\u01f2 \u0229\u0229 \u01e5 \u0281\u0281\u0281\u0281\u0281\u0281\u0293\u0293\u0293", + " \u028b \u025a\u025a \u0274 \u0275\u0275\u027a\u0282\u0282\u0282\u028c \u0283 \u0284\u0284\u028d\u028d \u028e\u028e\u028e \u0266\u0266\u0266\u0266\u0266\u0266 \u0285\u028f\u028f\u028f\u0290\u027c\u0270\u0270\u027d\u027e\u0286\u0279\u027f\u027f \u0263\u0264\u021e\u0291\u0291\u0288\u0288\u020e\u020e\u0294\u0295 \u0280\u0280\u0280 \u0272 \u01f1\u01f1\u01dc\u01f2\u01f2 \u0229\u0229\u01e5\u01e5 \u0281\u0281\u0281\u0281\u0281\u0281\u0293\u0293\u0293\u0293\u0293\u0293 ", + " \u028b\u028b \u025a\u025a \u0275\u0275\u027a\u0282\u0282\u0282\u028c \u0283\u0284\u0284\u028d\u028d \u028e\u0266\u0266\u0266\u0266\u0266 \u0285\u028f\u028f\u028f\u0290\u027c\u027c\u0267\u0278\u027d\u027e\u0286\u0279\u027f\u027f \u0296\u0297\u0287\u0291\u0291\u0288\u021f\u0218\u0269\u020e\u0294\u0295 \u0280\u0280 \u0272\u0272\u01d7\u01f1\u01dc\u01f2 \u0229\u0229 \u0281\u0281\u0281\u0281\u0281\u0281\u0293\u0293\u0293\u0293\u0293\u0293 ", + " \u028b\u028b \u0298\u0298\u025a\u0275\u0275\u027a\u027a\u0282\u0282\u028c\u028c \u0284\u028d\u028d \u028e\u028e\u0266\u0266\u0266 \u028f\u028f\u0290\u0290\u027c\u027c\u0299\u0271\u027d\u0286\u0286 \u027f\u027f \u0296\u0297\u029a\u029a\u0288\u0288\u021f\u021f\u021f\u0218\u020e\u020e\u0294\u0295\u0295\u0295\u0295 \u0280 \u0272\u0272\u01d7 \u01d8\u01f2 \u01e5 \u0281\u0281\u029b\u0281\u0281\u0281\u0293\u0293\u0293\u0293\u0293\u0293 ", + " \u028b \u0298\u0298 \u029c\u029c\u027a\u027a\u0282\u0282\u029d\u029d \u0284\u0284\u028d\u029e \u028e\u0266\u0266\u0266 \u029f\u02a0\u0290\u0290\u027c\u027c\u0270\u0271\u027d\u0286\u0286 \u027f\u027f \u0296\u029a\u029a\u0288\u02a1\u02a2\u021e\u021f\u021f\u021f\u0218\u020e \u0295\u0295\u0295\u0295\u0295\u0295\u0295 \u0280\u0280 \u0272\u01d7\u01d7\u01dc\u02a3\u01f2 \u01e5\u01e5 \u02a4\u02a4\u02a4\u02a4\u0281\u0293\u0293\u0293\u0293\u0293\u0293 ", + " \u028b \u0298\u0298 \u029c\u027a\u027a\u0282\u0282\u029d\u029d \u0284\u0284\u028d \u02a5\u02a6\u0266\u0266 \u029f\u02a0\u0290 \u027c\u0267\u0299\u0271\u027d\u0286\u0286 \u027f \u0296\u029a\u029a\u02a7 \u02a2\u02a2\u021e\u021e\u021f\u021f\u0218\u0218\u020e \u02a8 \u0295\u0295\u0295\u0295\u0295\u0295\u0295 \u0280\u0280 \u0272\u01d7\u01dc\u01f2\u01f2 \u02a9\u02a4\u02a4\u02a4\u02aa\u02aa\u02aa\u02ab\u02ab\u0293 ", + " \u028b \u0298\u029c\u029c\u027a\u0282\u0282\u0282\u029d \u0284\u0284\u028d \u02ac\u02ad\u02ad\u02ad \u029f\u02a0\u0290 \u027c\u0267\u0270\u0271\u027e\u0286\u0279\u027f\u027f \u0296\u029a\u029a \u02ae\u02a2 \u021e\u02af\u021f\u021f\u0218\u020e \u02a8 \u02b0\u0295\u0295\u0295\u0295\u0295\u0295\u0280\u0280 \u01d7\u01f1\u01dc\u02a3 \u02a9\u02a9\u02a9\u02a9\u02aa\u02aa\u02aa\u02aa\u02aa\u02b1\u02b1 ", + "\u028b\u028b \u029c\u029c\u027a\u027a\u0282\u0282\u029d \u0284\u028d \u02b2\u02b2 \u02ad\u02a5 \u02a0\u0290\u0290\u02a5\u027c\u0270\u0278\u0271\u027e\u0286\u0279\u027f\u027f \u0296\u029a \u02ae\u02ae \u021e\u021e\u021f\u021f\u0218\u0218\u020e \u02a8 \u02b0 \u0280\u0280 \u0272\u02b3\u02b4\u02b5\u01f2\u02b6\u02b6\u02a9\u02aa\u02aa\u02aa \u02b1\u02b1 ", + "\u028b \u029c\u029c\u027a\u027a\u0282\u0282\u029d\u02b7 \u02b8\u02b9 \u02ac\u02b2\u02b2 \u02a5 \u029f\u02a0\u0290\u0290\u027c\u027c\u0267\u0270\u027d\u027e\u0286\u0279\u027f\u027f \u0296\u0296\u029a \u02ae\u02ae\u02a2 \u021e\u021e\u021f\u021f\u0218\u020e\u02ba \u02a8 \u02b0 \u0280 \u0272\u02b3\u02b4\u02bb\u02bb\u02bb\u02bc \u02b1\u02b1\u02b1\u02b1 ", + " \u029c\u027a\u027a\u0282\u0282\u029d\u02b7\u02b7 \u02b8\u02b9 \u02ac\u02b2 \u02bd\u02a5 \u029f\u02a0\u0290\u0290\u027c\u0267\u0270\u0278\u027d\u0286\u0286\u0279\u027f\u027f \u0296\u0296\u029a \u02ae\u02ae \u02a2 \u02af\u021e\u021f\u021f\u0218\u0218\u02be \u02a8\u02a8 \u02b0 \u0280 \u02b6\u02b6\u0272\u02b3\u02bb\u01d8\u01d8\u02bf\u02bf \u02b1\u02b1\u02b1\u02b1\u02b1 ", + " \u029c\u029c\u027a\u0282\u0282\u029d\u02b7\u02b7 \u02b8\u02b8 \u02b2\u02b2 \u02bd\u02bd \u02a5 \u029f\u02a0\u0290\u02a5\u027c\u027c\u0299\u0278\u027d\u0286\u0286 \u027f \u0296\u0296\u029a \u02ae\u02ae \u02a2 \u021e\u02c0\u021f\u021f\u0218\u02be\u02ba \u02a8 \u02b0 \u02c1\u02b6\u02bb\u02bb\u0272\u02b3\u02b5\u01d8\u01d8 \u02b1\u02b1\u02b1\u02b1\u02b1 ", + " \u029c\u029c\u027a\u0282\u0282\u0282\u029d\u02b7 \u02c2\u02c3 \u02ac\u02b2 \u02bd\u02bd \u02a5 \u029f\u02a0\u0290\u02a5\u027c\u0267\u0270\u0271\u027d\u0286\u0286\u027f\u027f \u0296\u029a\u029a \u02ae\u02ae \u02a2 \u02c0\u021f\u021f\u0218\u0218\u02ba \u02a8 \u02b0 \u02c1\u02c1\u02c1\u02c4\u02bb \u0272\u02b3\u02b5\u01d8\u01d8 \u02c5\u02c6 \u02b1\u02b1\u02b1\u02b1\u02b1 ", + " \u029c\u029c\u027a\u0282\u0282\u0282\u029d\u02b7 \u02c3 \u02ac\u02b2 \u02bd\u02bd \u02a5\u02a5 \u029f\u02a0\u0290\u02a5\u027c\u0270\u0270\u0271\u027e\u0286\u0279\u027f\u027f \u0296\u0296\u029a \u02ae\u02ae \u02a2\u02a2 \u02c0\u02c0\u021f\u021f\u0218\u02be \u02a8 \u02b0 \u02c1\u02c1\u02c4\u02c4 \u02b3\u02b4\u02b5\u01d8\u01d8 \u02c6\u02c6 \u02b1\u02b1\u02b1\u02b1 ", + " \u029c\u027a\u027a\u0282\u0282\u029d\u02b7 \u02c2\u02c3\u02ac\u02b2 \u02bd \u02a5\u02a5 \u02c7\u02c7 \u029f\u02a0\u0290\u0290\u027c\u027c\u0267\u0299\u027d\u027e\u0286\u0279\u027f\u027f \u0296\u0296\u029a \u02ae\u02ae \u02a2 \u02c0\u021f\u021f\u0218\u02be \u02a8 \u02b0 \u02c1\u02c1\u02c1\u02c4\u02c4 \u02b3\u02b3\u02b5\u01d8\u01d8 \u02c6 \u02b1\u02b1\u02b1\u02b1 ", + " \u029c\u029c\u027a\u0282\u0282\u029d\u02b7\u02b7 \u02c2\u02c3\u02ac\u02b2 \u02bd \u02a5\u02c7\u02c7 \u029f\u02a0\u0290\u0290\u027c\u0267\u0270\u0278\u027d\u027e\u0286\u0279\u027f\u027f \u0296\u029a\u029a \u02ae\u02ae \u02c8\u02c8\u02c8\u02c8\u02c8 \u02c0\u021f\u021f\u0218 \u02a8 \u02b0 \u02c1\u02c1\u02c1\u02c4\u02c4 \u0272\u02b4\u02b5\u01d8 \u02c6 \u02b1\u02b1\u02b1\u02b1", + "\u02c9\u02c9 \u029c\u029c\u027a\u0282\u0282\u029d\u029d\u02b7 \u02c2\u02c3\u02ac\u02b2 \u02bd \u02a5 \u029f\u02a0\u0290\u0290\u027c\u027c\u0267\u0278\u027d\u027e\u0286\u0279\u027f \u0296\u029a \u02ae \u02c8\u02c8 \u02c8\u02c8 \u02c0\u021f\u021f\u0218\u02ba \u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8 \u02b0 \u02c1\u02c1\u02ca\u02c4\u02cb \u0272\u02b3\u02b5\u02b5\u01d8 \u02c6 \u02b1", + " \u02c9\u029c\u029c\u027a\u0282\u0282\u0282\u029d\u02b7 \u02c3 \u02b2 \u02bd\u02bd \u02a5\u02a5 \u029f\u02a0\u0290\u02a5\u027c\u0267\u0299\u0271\u027d\u0286\u0286\u0279\u027f \u0296\u0296\u029a \u02ae\u02cc \u02c8\u02c8\u02c8 \u02c8 \u02c0\u021f\u02be\u02be \u02a8\u02a8\u02a8\u02a8\u02a8\u02c1\u02c1\u02c1\u02ca\u02ca \u02cb\u02cb \u0272\u02b4\u02b4 \u01d8 \u02c6 ", + " \u029c\u029c\u027a\u027a\u0282\u0282\u029d\u02b7 \u02c3\u02c3\u02b2\u02b2 \u02bd\u02bd \u02a5\u02a5\u02a5\u029f\u02a0\u0290\u02a5\u027c\u0267\u0270\u0271\u027e\u0286\u0286\u027f\u027f \u0296\u0296 \u02cd\u02cd \u02ce\u02ce\u02c8\u02c8 \u02c8 \u02c0\u02c0\u02be\u02cf \u02d0\u02d0\u02c1\u02ca\u02ca \u02d1\u02cb\u02d2\u02d2 \u0272\u02b3\u02b5 \u01d8 \u02c6\u02c6 ", + " \u029c\u029c\u027a\u0282\u0282\u029d\u02b7\u02b7 \u02c3\u02c3\u02ac\u02b2 \u02bd\u02bd \u029f\u0290\u0290\u02a5\u027c\u0267\u0299\u0271\u027d\u0286\u0286\u027f\u027f \u0296\u02d3 \u02cd \u02ce \u02c8 \u02c8\u02d4\u02d4\u02be \u02d0\u02d0\u02d5\u02d5 \u02d1\u02d1\u02d1 \u02cb \u02d2 \u0272\u02b4\u02b5\u01d8\u01d8 \u02c6\u02c6 ", + "\u029c\u029c\u027a\u0282\u0282\u029d\u029d\u02b7 \u02c2\u02c3\u02ac\u02b2 \u02bd\u02bd \u02a0\u0290\u0290\u027c\u027c\u02d6\u0270\u0271\u027e\u0286\u0279\u027f\u027f \u0296\u02d7\u02d3 \u02cd \u02c8\u02c8 \u02c8\u02c8\u02c8\u02c0\u02c0\u02be\u02ba \u02d0\u02d0\u02ca\u02ca\u02d8 \u02cb\u02d2\u02d2 \u02b3\u02b3\u02b5\u01d8\u01d8 \u02c6 ", + "\u029c\u027a\u0282\u0282\u0282\u029d\u02b7 \u02c3\u02ac\u02b2 \u02bd\u02bd \u02a0\u0290\u0290\u027c\u027c\u02d6\u0278\u027d\u027e\u0286\u0279\u027f\u027f \u0296\u0296\u02d3 \u02d9\u02d9\u02cd \u02c8\u02c8\u02c8 \u02da\u02c0\u02c0\u02be \u02d0\u02d0\u02ca\u02ca \u02d8 \u02cb\u02cb\u02d2\u02d2 \u0272\u02b4\u02b5\u01d8 \u02c6 ", + "\u027a\u0282\u0282\u0282\u029d\u02b7 \u02c3\u02c3\u02b2 \u02bd\u02bd \u02a5\u02a0\u0290\u0290\u027c\u027c\u02d6\u02db\u02dc\u027e\u0286\u0279\u027f \u0296\u02d3 \u02d9\u02d9\u02cd \u02da\u02c0\u02be\u02be \u02d0\u02d0\u02ca\u02ca \u02d8 \u02cb\u02cb\u02d2 \u02b3\u02b5\u02b5\u01d8 \u02c6 ", + "\u027a\u0282\u0282\u029d\u02b7\u02b7 \u02c3\u02c3\u02ac\u02b2 \u02bd \u02a5\u02a5\u02a0\u02a0\u0290\u02dd\u027c\u02de\u02df\u02dc\u02e0\u0286\u0279\u027f \u0296\u0296\u02d3 \u02d9\u02d9 \u02cd \u02da\u02c0\u02c0\u02be\u02ba \u02d0\u02d0\u02ca\u02ca \u02d8 \u02cb \u02d2 \u02b4\u02b5 \u01d8 \u02c6\u02c6 ", + "\u0282\u0282\u029d\u02b7\u02b7 \u02c2\u02c3\u02b2\u02b2 \u02bd \u02a5\u02a5 \u02a0\u0290\u0290\u02dd\u027c\u02db\u02df\u02e0\u02e1\u02e2\u027f\u027f \u0296\u0296\u02d3 \u02d9 \u02cd\u02cd \u02da\u02c0\u02c0\u02be\u02ba\u02ba\u02d0\u02d0\u02ca\u02ca \u02d8 \u02cb \u02d2 \u02b3\u02b3\u02b5\u01d8\u01d8 \u02c6\u02c6 ", + "\u0282\u029d\u029d\u02b7 \u02c2\u02c3\u02ac\u02b2 \u02bd \u02a5 \u02a0\u0290\u0290\u02dd\u027c\u02db\u02df\u02e0\u02e2\u02e2\u027f\u027f \u0296\u0296\u02d3 \u02d9 \u02cd \u02da\u02da\u02c0\u02c0\u02be\u02be\u02d0\u02d0\u02ca\u02ca\u02e3\u02e3\u02e4 \u02d8 \u02cb \u02d2 \u02b3\u02b4\u02e5\u01d8\u01d8 ", + "\u0282\u029d\u02b7 \u02c3\u02c3\u02b2 \u02bd\u02bd \u02a5 \u02a0\u0290\u0290\u02dd\u027c\u02df\u02dc\u02e0\u02e2 \u027f\u027f \u0296\u0296\u02d3 \u02d9\u02d9 \u02cd \u02da\u02da\u02c0\u02cf\u02e6\u02d0\u02e7\u02ca \u02e4\u02e4\u02e4\u02d8\u02d8\u02d8\u02d8\u02d8 \u02cb\u02cb\u02e8\u02d2 \u02b3\u02b4\u02b5\u01d8 ", + "\u029d\u02b7 \u02c3\u02c3\u02ac \u02bd\u02bd \u02a5\u02a0\u0290\u02dd\u02dd\u027c\u02dc\u02df\u02e2\u02e2 \u027f\u027f \u0296\u02e9\u0296 \u02d9\u02d9 \u02cd \u02ea \u02da\u02c0\u02c0\u02e6\u02cf\u02e7\u02ca \u02d8\u02d8\u02d8\u02d8\u02d8\u02d8\u02d8\u02cb\u02cb\u02e8\u02d2 \u02eb\u02b4\u02ec\u01d8 ", + "\u02b7\u02b7 \u02c2\u02c3\u02b2\u02b2 \u02bd\u02bd \u02a5\u02a5\u02dd\u02dd\u027c \u02dc\u02e1\u02e1 \u027f\u027f \u0296\u02e9\u02d3 \u02d9\u02d9 \u02cd\u02cd \u02ea\u02ea \u02da\u02ed\u02ed\u02cf\u02ee\u02ca \u02d8\u02cb\u02e8\u02e8\u02d2 \u02b3\u02b5\u02e5\u01d8 ", + "\u02b7 \u02c2\u02c3\u02ac\u02b2 \u02dd\u027c\u027c \u02e0\u02e1 \u027f\u027f \u02e9\u02e9\u02d3 \u02d9\u02d9 \u02cd\u02cd \u02ea \u02ef\u02ed\u02ed\u02ed\u02cf\u02cf\u02f0 \u02f1\u02cb\u02e8\u02d2\u02d2 \u02b3\u02eb\u02ec\u02ec\u01d8 ", + " \u02c3\u02ac\u02b2 \u02dd\u027c\u027c \u02e0\u02f2 \u027f\u027f\u0296\u0296\u02d3 \u02d9 \u02cd\u02cd \u02ea \u02ef\u02ef\u02f3\u02f4\u02f4\u02da\u02f0\u02f0\u02f0\u02f0 \u02f1 \u02cb\u02e8\u02d2\u02d2 \u02f5\u02f5 \u02b3\u02eb\u02b5\u01d8\u01d8 ", + " \u02c3\u02c3\u02ac \u02dd\u027c\u02f6\u02f2\u02e0 \u027f\u0296\u0296\u02d3 \u02d9\u02d9 \u02cd\u02cd \u02ea \u02ef\u02ef\u02f4\u02f4\u02f7\u02f8\u02f8\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0 \u02f1 \u02cb\u02cb\u02e8\u02d2\u02d2\u02f5\u02f5 \u02eb\u02b4\u02ec\u01d8\u01d8 ", + " \u02c2\u02c3\u02b2 \u02dd\u02dd\u027c\u02f6\u02f9\u02f2\u027f\u027f\u0296\u0296\u0296 \u02d9\u02d9 \u02cd \u02ea \u02fa\u02ef\u02ef\u02f4 \u02f7\u02f8\u02f8\u02f8\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02fb\u02f0 \u02fc\u02e8\u02e8\u02f5\u02f5 \u02b3\u02b4\u02e5\u01d8\u01d8 ", + "\u02c2\u02c3\u02ac\u02b2 \u02dd\u02dd\u027c\u02f6\u02f9\u02fd\u02fe\u02fe\u0296\u0296\u02d3 \u02d9\u02d9 \u02cd\u02cd \u02ea \u02ff\u02fa\u02ef\u02f4\u02f4 \u02f7\u02f8\u02f8\u02f8\u02f8\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02fb\u02fb\u02f0\u02f0\u02f0\u02f0\u02f0\u02f0\u02fc\u02e8\u02e8\u02d2 \u02b3\u02b3\u02b5\u02e5\u01d8\u01d8 ", + "\u02c3\u02b2\u02b2 \u02dd\u027c\u027c\u02f9\u02f9\u02fd\u02fe\u0296\u0296\u02d3 \u02d9\u02d9 \u02cd\u02cd \u02ea \u02fa\u02fa\u02fa\u02ef\u02f4 \u02f7\u02f7\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02fb\u02f8\u02f8\u02f0\u02f0\u02f0\u02f0\u02f0\u02fc\u02f0\u02e8\u02e8\u02d2 \u02b3\u02b3\u02b5\u02e5\u01d8 ", + "\u02ac\u02b2 \u02dd\u027c \u02f9\u02f9\u02fd\u02fe\u0296\u0296 \u02d9 \u02cd\u02cd \u02ff \u02f4\u02f4 \u02f7\u02f7\u02f7\u02f7\u02f8\u02f7\u02f7\u02f7\u02f7\u02f7\u02fb\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f8\u02f0\u02f0\u02fc\u02f0\u02f0\u02e8\u02d2 \u02b3\u02b4\u02b5 \u01d8 ", + "\u02b2 \u02dd\u02dd\u027c \u02fd\u02fd\u02fe\u0296\u02d3 \u02cd\u02cd \u02f8\u02f8\u02f8\u02fc\u02f0\u02f0\u02f0\u02d2\u02d2 \u02b3\u02b4\u02b5 \u01d8 ", + "\u02b2 \u02dd\u02dd\u027c \u02fd\u02fd\u02fe\u0296\u02d3 \u02cd \u02fc\u02f8\u02f0\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b5\u02b5\u01d8\u01d8 ", + " \u02dd\u027c\u027c \u02fd\u02fd\u0296\u0296\u02d3 \u02cd\u02cd \u02f8\u02f8\u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b3\u02b5\u02b5\u01d8\u01d8 ", + " \u02dd\u02dd\u027c \u02fd\u02fd\u0296\u0296 \u02cd\u02cd \u02f8\u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b4\u02b5\u02b5\u01d8 ", + " \u02dd\u02dd\u027c \u02fd\u02fe\u0296\u02d3 \u02cd\u02cd \u02f8\u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b4\u02b5 \u01d8 ", + " \u02dd\u027c \u02fd\u02fe\u0296\u02d3 \u02cd\u02cd \u02f8\u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b4\u02b5 \u01d8 ", + " \u02dd \u02fd\u02fd\u02fe\u0296\u02d3 \u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3 \u02b5\u01d8\u01d8 ", + " \u02fd\u02fd\u0296\u0296\u02d3 \u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b4\u02b5\u02b5\u01d8 ", + " \u02fd\u02fd\u0296\u0296\u02d3 \u02f8\u02f0\u02f0\u02f0\u02d2 \u02b3\u02b4\u02b5 \u01d8 " + ] +} \ 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 new file mode 100644 index 000000000..aa24b0418 --- /dev/null +++ b/tests/visual_tests/grids/rtl-point-200-200-1.0-grid-reference.json @@ -0,0 +1,59 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ! ", + " ! ", + " ", + " !! ! ! ! ", + " ! ! ! ", + " ", + " ", + " ! ", + " ", + " ! ! ", + " ", + " ! ", + " !!! ", + " !!!! ", + " !! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/rtl-point-200-reference.json b/tests/visual_tests/grids/rtl-point-200-reference.json deleted file mode 100644 index 55c4098ec..000000000 --- a/tests/visual_tests/grids/rtl-point-200-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-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 new file mode 100644 index 000000000..25c5fc711 --- /dev/null +++ b/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-1.0-grid-reference.json @@ -0,0 +1,109 @@ +{ + "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 new file mode 100644 index 000000000..83e2d2aaa --- /dev/null +++ b/tests/visual_tests/grids/shield-on-polygon-500-100-1.0-grid-reference.json @@ -0,0 +1,39 @@ +{ + "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 new file mode 100644 index 000000000..176d251f7 --- /dev/null +++ b/tests/visual_tests/grids/shield-on-polygon-600-400-1.0-grid-reference.json @@ -0,0 +1,115 @@ +{ + "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 new file mode 100644 index 000000000..a5d255d4b --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-490-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-490-reference.json deleted file mode 100644 index 09e951570..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-490-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-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-495-100-1.0-grid-reference.json new file mode 100644 index 000000000..b0f75845b --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-495-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-1-495-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-495-reference.json deleted file mode 100644 index bb3d6c471..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-495-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-1-497-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-497-100-1.0-grid-reference.json new file mode 100644 index 000000000..b190871af --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-497-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-1-497-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-497-reference.json deleted file mode 100644 index d791519c4..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-497-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-1-498-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-498-100-1.0-grid-reference.json new file mode 100644 index 000000000..ca0db3884 --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-498-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-1-498-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-498-reference.json deleted file mode 100644 index acbc5d159..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-498-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-1-499-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-499-100-1.0-grid-reference.json new file mode 100644 index 000000000..1b92a2855 --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-499-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-1-499-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-499-reference.json deleted file mode 100644 index f309a6079..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-499-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-1-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-500-100-1.0-grid-reference.json new file mode 100644 index 000000000..26459bd0f --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-500-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-1-500-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-500-reference.json deleted file mode 100644 index 01b037e96..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-500-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-1-501-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-501-100-1.0-grid-reference.json new file mode 100644 index 000000000..88cc49451 --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-501-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-1-501-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-501-reference.json deleted file mode 100644 index 083c379bd..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-501-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-1-502-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-502-100-1.0-grid-reference.json new file mode 100644 index 000000000..050335c81 --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-502-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-502-reference.json deleted file mode 100644 index 8ea785d53..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-502-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 new file mode 100644 index 000000000..aa2e746c4 --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-505-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-505-reference.json deleted file mode 100644 index 95be81435..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-505-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-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-510-100-1.0-grid-reference.json new file mode 100644 index 000000000..f0706c77d --- /dev/null +++ b/tests/visual_tests/grids/shieldsymbolizer-1-510-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-510-reference.json deleted file mode 100644 index f1eda2204..000000000 --- a/tests/visual_tests/grids/shieldsymbolizer-1-510-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/simple-100-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-100-100-1.0-grid-reference.json new file mode 100644 index 000000000..d250023b9 --- /dev/null +++ b/tests/visual_tests/grids/simple-100-100-1.0-grid-reference.json @@ -0,0 +1,41 @@ +{ + "keys": [ + "", + "2", + "5", + "8", + "1", + "9", + "10", + "3", + "7" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! !!!! ", + " ! ! #### $$$$$ ", + " ", + " ", + " %% ", + " % %% %%% %% %%%% & '", + " % % % %% ", + " % % % % ", + " ", + " ", + " (( (((( ((( )))))) ", + " (((( ((( (( ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-100-reference.json b/tests/visual_tests/grids/simple-100-reference.json deleted file mode 100644 index 672cc86fa..000000000 --- a/tests/visual_tests/grids/simple-100-reference.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "keys": [ - "", - "-2", - "-5", - "-8", - "-1", - "-9", - "-10", - "-3", - "-7" - ], - "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 new file mode 100644 index 000000000..8b25d98e0 --- /dev/null +++ b/tests/visual_tests/grids/simple-150-100-1.0-grid-reference.json @@ -0,0 +1,41 @@ +{ + "keys": [ + "", + "2", + "7", + "4", + "10", + "1", + "6", + "3", + "8" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! !!!! # ### # # # ", + " ! !$$ $$ ### # ### %%%", + " ", + " ", + " &&& & ''' ' ", + " & & &&&&&& &&&& && ' ' ''''' ' '' ", + " & & && &&& ' ''' ' ' ", + " && & ' ' ' ", + " ", + " ", + " ( ( ) ))) )))))) ", + " ((((( ( (((( ))) ) ))) ", + " ( ((((( (( (((( ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-150-reference.json b/tests/visual_tests/grids/simple-150-reference.json deleted file mode 100644 index d44818954..000000000 --- a/tests/visual_tests/grids/simple-150-reference.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "keys": [ - "", - "-2", - "-7", - "-4", - "-10", - "-1", - "-6", - "-3", - "-8" - ], - "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 new file mode 100644 index 000000000..f52fcbdfa --- /dev/null +++ b/tests/visual_tests/grids/simple-250-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "keys": [ + "", + "2", + "5", + "8", + "10", + "1", + "4", + "7", + "3", + "6", + "9" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ! ! # # # $ $ $ ", + " !!! ! ! !! ! # ### # ####### $$$$$ $$ $ $$$$ ", + " !!!!!! ! !! !! # ###### ## #### $$$$ $ $$ $$$$ $ %%%% ", + " $ ", + " ", + " && ''' ' ' ((( ( ", + " & &&&&&& &&&& && ' ' '''''' '''' '''( ( ((((( ( (((((((( ", + " & && & & && ' ' '' '' ' '' ( ((( ( ((( ( (", + " & & & & '' ' ' ( ( ( ( ( ", + " ", + " ", + " ) ) ) * * + ", + " ) ))) ) ) )))))) * *** * * *** +++++ + +++ ", + " ) ))))) )) )) )) * ****** ***** ++++ + + +++ ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-250-reference.json b/tests/visual_tests/grids/simple-250-reference.json deleted file mode 100644 index 5ef322152..000000000 --- a/tests/visual_tests/grids/simple-250-reference.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "keys": [ - "", - "-2", - "-5", - "-8", - "-10", - "-1", - "-4", - "-7", - "-3", - "-6", - "-9" - ], - "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 new file mode 100644 index 000000000..3bf047bed --- /dev/null +++ b/tests/visual_tests/grids/simple-300-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "keys": [ + "", + "2", + "5", + "8", + "10", + "1", + "4", + "7", + "3", + "6", + "9" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ! ! ! # $ $ ", + " ! !!! ! !!! ! ##### #### $$$$$ $$$ $$ % %%% %%", + " ! !!!!!! ! !! !! # ##### # ## $ $$$$$ $$ $$$ $ %% % % ", + " $$ ", + " ", + " &&& & '' ' ((( ( ", + " & & &&&&& &&&& && ' '' ''' '''' ''' ( ( ((((( (((((((( ((% ", + " & && && & ' ' '' ' '' ( (( (( ((( ( ", + " &&& & & ' ' ' ' ((( ( (( ( ", + " ", + " ", + " ) ) )) * * + + ", + " ) ))) ) )) ))))))) * *** * * * + +++ + ++++ ++ ", + " ) )))))) )) ))))))) * ***** ** ** + +++++ +++ ++ ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-300-reference.json b/tests/visual_tests/grids/simple-300-reference.json deleted file mode 100644 index e3d08eb83..000000000 --- a/tests/visual_tests/grids/simple-300-reference.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "keys": [ - "", - "-2", - "-5", - "-8", - "-10", - "-1", - "-4", - "-7", - "-3", - "-6", - "-9" - ], - "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 new file mode 100644 index 000000000..b88c666e5 --- /dev/null +++ b/tests/visual_tests/grids/simple-400-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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/simple-400-reference.json b/tests/visual_tests/grids/simple-400-reference.json deleted file mode 100644 index f7b867997..000000000 --- a/tests/visual_tests/grids/simple-400-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/simple-600-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-600-100-1.0-grid-reference.json new file mode 100644 index 000000000..a6638f296 --- /dev/null +++ b/tests/visual_tests/grids/simple-600-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-reference.json b/tests/visual_tests/grids/simple-600-reference.json deleted file mode 100644 index 8adf03a35..000000000 --- a/tests/visual_tests/grids/simple-600-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-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-800-100-1.0-grid-reference.json new file mode 100644 index 000000000..dbd1b4bca --- /dev/null +++ b/tests/visual_tests/grids/simple-800-100-1.0-grid-reference.json @@ -0,0 +1,43 @@ +{ + "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-800-reference.json b/tests/visual_tests/grids/simple-800-reference.json deleted file mode 100644 index e8a4bbce7..000000000 --- a/tests/visual_tests/grids/simple-800-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-E-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-E-500-100-1.0-grid-reference.json new file mode 100644 index 000000000..8a1b162de --- /dev/null +++ b/tests/visual_tests/grids/simple-E-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! ! ", + " ! ! !!!!! !! !!! ", + " !! !! !!! ", + " ! ! ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-E-500-reference.json b/tests/visual_tests/grids/simple-E-500-reference.json deleted file mode 100644 index 9c75e93cb..000000000 --- a/tests/visual_tests/grids/simple-E-500-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 new file mode 100644 index 000000000..b049b10d1 --- /dev/null +++ b/tests/visual_tests/grids/simple-N-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! ! !! ", + " !!!!!! !!! !! ", + " ! !! !! !! ", + " ! ! ! ", + " ", + " ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-N-500-reference.json b/tests/visual_tests/grids/simple-N-500-reference.json deleted file mode 100644 index eaff04754..000000000 --- a/tests/visual_tests/grids/simple-N-500-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 new file mode 100644 index 000000000..aa030d211 --- /dev/null +++ b/tests/visual_tests/grids/simple-NE-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! ! ", + " ! !!!!! !! !!! ", + " !! !! !!! ", + " ! ! ! ", + " ", + " ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-NE-500-reference.json b/tests/visual_tests/grids/simple-NE-500-reference.json deleted file mode 100644 index 1451527ce..000000000 --- a/tests/visual_tests/grids/simple-NE-500-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 new file mode 100644 index 000000000..1d054206d --- /dev/null +++ b/tests/visual_tests/grids/simple-NW-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! ! ", + " ! !!!!! !! !!! ", + " !! !! !!! ", + " ! ! ! ", + " ", + " ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-NW-500-reference.json b/tests/visual_tests/grids/simple-NW-500-reference.json deleted file mode 100644 index d67ce818c..000000000 --- a/tests/visual_tests/grids/simple-NW-500-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 new file mode 100644 index 000000000..28fb8011c --- /dev/null +++ b/tests/visual_tests/grids/simple-S-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ! ", + " ", + " ", + " !!! ! !! ", + " !!!!!! !!! !! ", + " ! !! !! !! ", + " ! ! ! ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-S-500-reference.json b/tests/visual_tests/grids/simple-S-500-reference.json deleted file mode 100644 index b33943023..000000000 --- a/tests/visual_tests/grids/simple-S-500-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 new file mode 100644 index 000000000..691c6d843 --- /dev/null +++ b/tests/visual_tests/grids/simple-SE-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ! ", + " ", + " ", + " !!! ! ", + " ! !!!!! !! !!! ", + " !! !! !!! ", + " ! ! ! ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-SE-500-reference.json b/tests/visual_tests/grids/simple-SE-500-reference.json deleted file mode 100644 index 012be0ddb..000000000 --- a/tests/visual_tests/grids/simple-SE-500-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 new file mode 100644 index 000000000..6f39d2c38 --- /dev/null +++ b/tests/visual_tests/grids/simple-SW-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ! ", + " ", + " ", + " !!! ! ", + " ! !!!!! !! !!! ", + " !! !! !!! ", + " ! ! ! ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-SW-500-reference.json b/tests/visual_tests/grids/simple-SW-500-reference.json deleted file mode 100644 index b9d90f7a5..000000000 --- a/tests/visual_tests/grids/simple-SW-500-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 new file mode 100644 index 000000000..e52b12abb --- /dev/null +++ b/tests/visual_tests/grids/simple-W-500-100-1.0-grid-reference.json @@ -0,0 +1,34 @@ +{ + "keys": [ + "", + "5" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " !!! ! ", + " ! !!!!! !! !!! ! ", + " !! !! !!! ", + " ! ! ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/simple-W-500-reference.json b/tests/visual_tests/grids/simple-W-500-reference.json deleted file mode 100644 index c5d0cf326..000000000 --- a/tests/visual_tests/grids/simple-W-500-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/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 new file mode 100644 index 000000000..6dd6a4db4 --- /dev/null +++ b/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-1.0-grid-reference.json @@ -0,0 +1,190 @@ +{ + "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 new file mode 100644 index 000000000..3f8724276 --- /dev/null +++ b/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-1.0-grid-reference.json @@ -0,0 +1,152 @@ +{ + "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 new file mode 100644 index 000000000..2ded48389 --- /dev/null +++ b/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-1.0-grid-reference.json @@ -0,0 +1,248 @@ +{ + "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 new file mode 100644 index 000000000..97fda9272 --- /dev/null +++ b/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-1.0-grid-reference.json @@ -0,0 +1,170 @@ +{ + "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 ", + " <<< + + + + + + +
+
expected
+
% difference
+
actual
+{{RESULTS}} +
+ + 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 new file mode 100644 index 000000000..808c0bdca Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..808c0bdca Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-1.0-agg.png 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 new file mode 100644 index 000000000..c8a3eba8d Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..c8a3eba8d Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-1.0-cairo.png 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 new file mode 100644 index 000000000..25daa99fc --- /dev/null +++ b/tests/visual_tests/images/collision-600-400-1.0-grid.json @@ -0,0 +1,109 @@ +{ + "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 new file mode 100644 index 000000000..d0e7a446f Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..d0e7a446f Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-2.0-agg.png 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 new file mode 100644 index 000000000..d72f19440 Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..d72f19440 Binary files /dev/null and b/tests/visual_tests/images/collision-600-400-2.0-cairo.png differ diff --git a/tests/visual_tests/images/collision-600-reference.png b/tests/visual_tests/images/collision-600-reference.png deleted file mode 100644 index a0aee211c..000000000 Binary files a/tests/visual_tests/images/collision-600-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 new file mode 100644 index 000000000..8cb572d99 Binary files /dev/null and b/tests/visual_tests/images/expressionformat-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..cb49e42f1 Binary files /dev/null and b/tests/visual_tests/images/expressionformat-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..8d468f4f1 Binary files /dev/null and b/tests/visual_tests/images/expressionformat-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..d8237b302 Binary files /dev/null and b/tests/visual_tests/images/expressionformat-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/expressionformat-500-reference.png b/tests/visual_tests/images/expressionformat-500-reference.png deleted file mode 100644 index c878ad31d..000000000 Binary files a/tests/visual_tests/images/expressionformat-500-reference.png and /dev/null differ diff --git a/tests/visual_tests/images/formating-500-reference.png b/tests/visual_tests/images/formating-500-reference.png deleted file mode 100644 index 0ab02b598..000000000 Binary files a/tests/visual_tests/images/formating-500-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 new file mode 100644 index 000000000..c3148b17a Binary files /dev/null and b/tests/visual_tests/images/formatting-1-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..8130f1995 Binary files /dev/null and b/tests/visual_tests/images/formatting-1-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4c2ce1bef Binary files /dev/null and b/tests/visual_tests/images/formatting-1-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..43f9fcf36 Binary files /dev/null and b/tests/visual_tests/images/formatting-1-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/formatting-1-500-reference.png b/tests/visual_tests/images/formatting-1-500-reference.png deleted file mode 100644 index 2fcd4f305..000000000 Binary files a/tests/visual_tests/images/formatting-1-500-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 new file mode 100644 index 000000000..c3148b17a Binary files /dev/null and b/tests/visual_tests/images/formatting-2-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..8130f1995 Binary files /dev/null and b/tests/visual_tests/images/formatting-2-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4c2ce1bef Binary files /dev/null and b/tests/visual_tests/images/formatting-2-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..43f9fcf36 Binary files /dev/null and b/tests/visual_tests/images/formatting-2-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/formatting-2-500-reference.png b/tests/visual_tests/images/formatting-2-500-reference.png deleted file mode 100644 index 2fcd4f305..000000000 Binary files a/tests/visual_tests/images/formatting-2-500-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 new file mode 100644 index 000000000..3a5c837d1 Binary files /dev/null and b/tests/visual_tests/images/formatting-3-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..6b8f26d88 Binary files /dev/null and b/tests/visual_tests/images/formatting-3-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..cd4f34ec0 Binary files /dev/null and b/tests/visual_tests/images/formatting-3-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..e5e965c12 Binary files /dev/null and b/tests/visual_tests/images/formatting-3-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/formatting-3-500-reference.png b/tests/visual_tests/images/formatting-3-500-reference.png deleted file mode 100644 index 415bb7e3b..000000000 Binary files a/tests/visual_tests/images/formatting-3-500-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 new file mode 100644 index 000000000..fa3ffc1c5 Binary files /dev/null and b/tests/visual_tests/images/formatting-4-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..fa3ffc1c5 Binary files /dev/null and b/tests/visual_tests/images/formatting-4-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4c2ce1bef Binary files /dev/null and b/tests/visual_tests/images/formatting-4-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..43f9fcf36 Binary files /dev/null and b/tests/visual_tests/images/formatting-4-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/formatting-4-500-reference.png b/tests/visual_tests/images/formatting-4-500-reference.png deleted file mode 100644 index fbc8d6bb1..000000000 Binary files a/tests/visual_tests/images/formatting-4-500-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 new file mode 100644 index 000000000..3fcb40dfc Binary files /dev/null and b/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..3fcb40dfc Binary files /dev/null and b/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..3fcb40dfc Binary files /dev/null and b/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..3fcb40dfc Binary files /dev/null and b/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..81c7c7c8e Binary files /dev/null and b/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..5757230f8 Binary files /dev/null and b/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..c20472cfb Binary files /dev/null and b/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..d766f92ae Binary files /dev/null and b/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..74b8cc143 Binary files /dev/null and b/tests/visual_tests/images/jalign-auto-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..24f4cc3f6 Binary files /dev/null and b/tests/visual_tests/images/jalign-auto-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..a53bce825 Binary files /dev/null and b/tests/visual_tests/images/jalign-auto-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..c7f264dff Binary files /dev/null and b/tests/visual_tests/images/jalign-auto-200-200-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/jalign-auto-200-reference.png b/tests/visual_tests/images/jalign-auto-200-reference.png deleted file mode 100644 index 6acf39cdc..000000000 Binary files a/tests/visual_tests/images/jalign-auto-200-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 new file mode 100644 index 000000000..19f85db78 Binary files /dev/null and b/tests/visual_tests/images/line-offset-900-250-1.0-agg-reference.png 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 new file mode 100644 index 000000000..51a7333be Binary files /dev/null and b/tests/visual_tests/images/line-offset-900-250-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..53ffcc28c Binary files /dev/null and b/tests/visual_tests/images/line-offset-900-250-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b83bd731f Binary files /dev/null and b/tests/visual_tests/images/line-offset-900-250-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/line-offset-900-reference.png b/tests/visual_tests/images/line-offset-900-reference.png deleted file mode 100644 index 37f3c4b6e..000000000 Binary files a/tests/visual_tests/images/line-offset-900-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 new file mode 100644 index 000000000..ddf38bc47 Binary files /dev/null and b/tests/visual_tests/images/lines-1-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b2d300f0f Binary files /dev/null and b/tests/visual_tests/images/lines-1-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4849cc4b3 Binary files /dev/null and b/tests/visual_tests/images/lines-1-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..81727a68e Binary files /dev/null and b/tests/visual_tests/images/lines-1-200-200-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-1-200-reference.png b/tests/visual_tests/images/lines-1-200-reference.png deleted file mode 100644 index ce5e0ab6a..000000000 Binary files a/tests/visual_tests/images/lines-1-200-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 new file mode 100644 index 000000000..551ae51eb Binary files /dev/null and b/tests/visual_tests/images/lines-1-400-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..42ab61c69 Binary files /dev/null and b/tests/visual_tests/images/lines-1-400-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..9b72fa609 Binary files /dev/null and b/tests/visual_tests/images/lines-1-400-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..249edc709 Binary files /dev/null and b/tests/visual_tests/images/lines-1-400-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-1-400-reference.png b/tests/visual_tests/images/lines-1-400-reference.png deleted file mode 100644 index 2bf567293..000000000 Binary files a/tests/visual_tests/images/lines-1-400-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 new file mode 100644 index 000000000..b91b87d54 Binary files /dev/null and b/tests/visual_tests/images/lines-1-600-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..515daedab Binary files /dev/null and b/tests/visual_tests/images/lines-1-600-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..fe0e52c3a Binary files /dev/null and b/tests/visual_tests/images/lines-1-600-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..64faecd1d Binary files /dev/null and b/tests/visual_tests/images/lines-1-600-600-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-1-600-reference.png b/tests/visual_tests/images/lines-1-600-reference.png deleted file mode 100644 index 0289ad480..000000000 Binary files a/tests/visual_tests/images/lines-1-600-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 new file mode 100644 index 000000000..02209ef2b Binary files /dev/null and b/tests/visual_tests/images/lines-1-800-800-1.0-agg-reference.png 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 new file mode 100644 index 000000000..425b01edf Binary files /dev/null and b/tests/visual_tests/images/lines-1-800-800-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..c4da4f388 Binary files /dev/null and b/tests/visual_tests/images/lines-1-800-800-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a26355864 Binary files /dev/null and b/tests/visual_tests/images/lines-1-800-800-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-1-800-reference.png b/tests/visual_tests/images/lines-1-800-reference.png deleted file mode 100644 index 235afaa46..000000000 Binary files a/tests/visual_tests/images/lines-1-800-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 new file mode 100644 index 000000000..1656c8730 Binary files /dev/null and b/tests/visual_tests/images/lines-2-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..05dbf909a Binary files /dev/null and b/tests/visual_tests/images/lines-2-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4849cc4b3 Binary files /dev/null and b/tests/visual_tests/images/lines-2-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..81727a68e Binary files /dev/null and b/tests/visual_tests/images/lines-2-200-200-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-2-200-reference.png b/tests/visual_tests/images/lines-2-200-reference.png deleted file mode 100644 index 46cda9ba3..000000000 Binary files a/tests/visual_tests/images/lines-2-200-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 new file mode 100644 index 000000000..965ad6a45 Binary files /dev/null and b/tests/visual_tests/images/lines-2-400-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..d646d5b54 Binary files /dev/null and b/tests/visual_tests/images/lines-2-400-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..58e840639 Binary files /dev/null and b/tests/visual_tests/images/lines-2-400-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..ca17344c8 Binary files /dev/null and b/tests/visual_tests/images/lines-2-400-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-2-400-reference.png b/tests/visual_tests/images/lines-2-400-reference.png deleted file mode 100644 index 6e34796da..000000000 Binary files a/tests/visual_tests/images/lines-2-400-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 new file mode 100644 index 000000000..4c81dc28c Binary files /dev/null and b/tests/visual_tests/images/lines-2-600-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..d7f2277cb Binary files /dev/null and b/tests/visual_tests/images/lines-2-600-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..9b2ab1cca Binary files /dev/null and b/tests/visual_tests/images/lines-2-600-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..62a026b9e Binary files /dev/null and b/tests/visual_tests/images/lines-2-600-600-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-2-600-reference.png b/tests/visual_tests/images/lines-2-600-reference.png deleted file mode 100644 index 48fec03f7..000000000 Binary files a/tests/visual_tests/images/lines-2-600-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 new file mode 100644 index 000000000..132acbcaa Binary files /dev/null and b/tests/visual_tests/images/lines-2-800-800-1.0-agg-reference.png 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 new file mode 100644 index 000000000..8a11d0236 Binary files /dev/null and b/tests/visual_tests/images/lines-2-800-800-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..781722106 Binary files /dev/null and b/tests/visual_tests/images/lines-2-800-800-2.0-agg-reference.png 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 new file mode 100644 index 000000000..e4cd18585 Binary files /dev/null and b/tests/visual_tests/images/lines-2-800-800-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-2-800-reference.png b/tests/visual_tests/images/lines-2-800-reference.png deleted file mode 100644 index 423da68a8..000000000 Binary files a/tests/visual_tests/images/lines-2-800-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 new file mode 100644 index 000000000..ddf38bc47 Binary files /dev/null and b/tests/visual_tests/images/lines-3-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b2d300f0f Binary files /dev/null and b/tests/visual_tests/images/lines-3-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4849cc4b3 Binary files /dev/null and b/tests/visual_tests/images/lines-3-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..81727a68e Binary files /dev/null and b/tests/visual_tests/images/lines-3-200-200-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-3-200-reference.png b/tests/visual_tests/images/lines-3-200-reference.png deleted file mode 100644 index ce5e0ab6a..000000000 Binary files a/tests/visual_tests/images/lines-3-200-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 new file mode 100644 index 000000000..a552848a5 Binary files /dev/null and b/tests/visual_tests/images/lines-3-400-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..2b1968b4d Binary files /dev/null and b/tests/visual_tests/images/lines-3-400-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..9b72fa609 Binary files /dev/null and b/tests/visual_tests/images/lines-3-400-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..249edc709 Binary files /dev/null and b/tests/visual_tests/images/lines-3-400-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-3-400-reference.png b/tests/visual_tests/images/lines-3-400-reference.png deleted file mode 100644 index 280df3f12..000000000 Binary files a/tests/visual_tests/images/lines-3-400-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 new file mode 100644 index 000000000..69d029785 Binary files /dev/null and b/tests/visual_tests/images/lines-3-600-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..c6ecf9c73 Binary files /dev/null and b/tests/visual_tests/images/lines-3-600-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..ee53ecad7 Binary files /dev/null and b/tests/visual_tests/images/lines-3-600-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..654a636bc Binary files /dev/null and b/tests/visual_tests/images/lines-3-600-600-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-3-600-reference.png b/tests/visual_tests/images/lines-3-600-reference.png deleted file mode 100644 index aac36f297..000000000 Binary files a/tests/visual_tests/images/lines-3-600-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 new file mode 100644 index 000000000..3a9295667 Binary files /dev/null and b/tests/visual_tests/images/lines-3-800-800-1.0-agg-reference.png 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 new file mode 100644 index 000000000..1d94e755c Binary files /dev/null and b/tests/visual_tests/images/lines-3-800-800-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..a8bdfead8 Binary files /dev/null and b/tests/visual_tests/images/lines-3-800-800-2.0-agg-reference.png 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 new file mode 100644 index 000000000..d1eb38697 Binary files /dev/null and b/tests/visual_tests/images/lines-3-800-800-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-3-800-reference.png b/tests/visual_tests/images/lines-3-800-reference.png deleted file mode 100644 index fd456ae9f..000000000 Binary files a/tests/visual_tests/images/lines-3-800-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 new file mode 100644 index 000000000..0ab97cb12 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..2db6719ec Binary files /dev/null and b/tests/visual_tests/images/lines-shield-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..d7ae2234d Binary files /dev/null and b/tests/visual_tests/images/lines-shield-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..e4d817d6e Binary files /dev/null and b/tests/visual_tests/images/lines-shield-200-200-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-shield-200-reference.png b/tests/visual_tests/images/lines-shield-200-reference.png deleted file mode 100644 index 529964344..000000000 Binary files a/tests/visual_tests/images/lines-shield-200-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 new file mode 100644 index 000000000..4269b4c06 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-400-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..d30efaca0 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-400-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..75a0ec6a2 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-400-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..5f32ddaf0 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-400-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-shield-400-reference.png b/tests/visual_tests/images/lines-shield-400-reference.png deleted file mode 100644 index 59d8da376..000000000 Binary files a/tests/visual_tests/images/lines-shield-400-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 new file mode 100644 index 000000000..f8fdcadac Binary files /dev/null and b/tests/visual_tests/images/lines-shield-600-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..20ba67d4e Binary files /dev/null and b/tests/visual_tests/images/lines-shield-600-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..ae0f4d94d Binary files /dev/null and b/tests/visual_tests/images/lines-shield-600-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a94c464a2 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-600-600-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-shield-600-reference.png b/tests/visual_tests/images/lines-shield-600-reference.png deleted file mode 100644 index 80c9b5135..000000000 Binary files a/tests/visual_tests/images/lines-shield-600-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 new file mode 100644 index 000000000..6e05b9255 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-800-800-1.0-agg-reference.png 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 new file mode 100644 index 000000000..54fbbabd4 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-800-800-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..a3797ce56 Binary files /dev/null and b/tests/visual_tests/images/lines-shield-800-800-2.0-agg-reference.png 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 new file mode 100644 index 000000000..4641d23ee Binary files /dev/null and b/tests/visual_tests/images/lines-shield-800-800-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/lines-shield-800-reference.png b/tests/visual_tests/images/lines-shield-800-reference.png deleted file mode 100644 index a3cd6bd26..000000000 Binary files a/tests/visual_tests/images/lines-shield-800-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 new file mode 100644 index 000000000..a4be38701 Binary files /dev/null and b/tests/visual_tests/images/list-100-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..9a5f9a092 Binary files /dev/null and b/tests/visual_tests/images/list-100-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..8e890f1ed Binary files /dev/null and b/tests/visual_tests/images/list-100-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..2b90990f6 Binary files /dev/null and b/tests/visual_tests/images/list-100-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-100-reference.png b/tests/visual_tests/images/list-100-reference.png deleted file mode 100644 index c8faf0348..000000000 Binary files a/tests/visual_tests/images/list-100-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 new file mode 100644 index 000000000..35ac17223 Binary files /dev/null and b/tests/visual_tests/images/list-150-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..44929ff9f Binary files /dev/null and b/tests/visual_tests/images/list-150-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4aaf1e871 Binary files /dev/null and b/tests/visual_tests/images/list-150-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..99cc5c435 Binary files /dev/null and b/tests/visual_tests/images/list-150-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-150-reference.png b/tests/visual_tests/images/list-150-reference.png deleted file mode 100644 index b72cec027..000000000 Binary files a/tests/visual_tests/images/list-150-reference.png and /dev/null differ diff --git a/tests/visual_tests/images/list-200-reference.png b/tests/visual_tests/images/list-200-reference.png deleted file mode 100644 index 22ea2df84..000000000 Binary files a/tests/visual_tests/images/list-200-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 new file mode 100644 index 000000000..b64483f6b Binary files /dev/null and b/tests/visual_tests/images/list-250-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..49eb5927f Binary files /dev/null and b/tests/visual_tests/images/list-250-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..569fd68ab Binary files /dev/null and b/tests/visual_tests/images/list-250-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..d0845ea9e Binary files /dev/null and b/tests/visual_tests/images/list-250-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-250-reference.png b/tests/visual_tests/images/list-250-reference.png deleted file mode 100644 index bfaa83183..000000000 Binary files a/tests/visual_tests/images/list-250-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 new file mode 100644 index 000000000..acda52026 Binary files /dev/null and b/tests/visual_tests/images/list-300-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..81239ee6a Binary files /dev/null and b/tests/visual_tests/images/list-300-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..369a6eba0 Binary files /dev/null and b/tests/visual_tests/images/list-300-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b0c77c6ee Binary files /dev/null and b/tests/visual_tests/images/list-300-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-300-reference.png b/tests/visual_tests/images/list-300-reference.png deleted file mode 100644 index 47de914e2..000000000 Binary files a/tests/visual_tests/images/list-300-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 new file mode 100644 index 000000000..52af55201 Binary files /dev/null and b/tests/visual_tests/images/list-400-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..ed891a4b5 Binary files /dev/null and b/tests/visual_tests/images/list-400-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..e4a970605 Binary files /dev/null and b/tests/visual_tests/images/list-400-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a48084fd5 Binary files /dev/null and b/tests/visual_tests/images/list-400-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-400-reference.png b/tests/visual_tests/images/list-400-reference.png deleted file mode 100644 index 1c6af9f54..000000000 Binary files a/tests/visual_tests/images/list-400-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 new file mode 100644 index 000000000..5072a3e89 Binary files /dev/null and b/tests/visual_tests/images/list-600-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..5dd736041 Binary files /dev/null and b/tests/visual_tests/images/list-600-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..1c5a781ac Binary files /dev/null and b/tests/visual_tests/images/list-600-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..5b488859f Binary files /dev/null and b/tests/visual_tests/images/list-600-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-600-reference.png b/tests/visual_tests/images/list-600-reference.png deleted file mode 100644 index 955c619fc..000000000 Binary files a/tests/visual_tests/images/list-600-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 new file mode 100644 index 000000000..9ef86a2e8 Binary files /dev/null and b/tests/visual_tests/images/list-800-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..a946fcb90 Binary files /dev/null and b/tests/visual_tests/images/list-800-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..db55e2e1d Binary files /dev/null and b/tests/visual_tests/images/list-800-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..1fa3a7bdd Binary files /dev/null and b/tests/visual_tests/images/list-800-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/list-800-reference.png b/tests/visual_tests/images/list-800-reference.png deleted file mode 100644 index 8c908b610..000000000 Binary files a/tests/visual_tests/images/list-800-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 new file mode 100644 index 000000000..95af7f48d Binary files /dev/null and b/tests/visual_tests/images/marker-multi-policy-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..73860a615 Binary files /dev/null and b/tests/visual_tests/images/marker-multi-policy-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..dd89464b6 Binary files /dev/null and b/tests/visual_tests/images/marker-multi-policy-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..1b2a9ce26 Binary files /dev/null and b/tests/visual_tests/images/marker-multi-policy-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-multi-policy-600-reference.png b/tests/visual_tests/images/marker-multi-policy-600-reference.png deleted file mode 100644 index 6441e6fb8..000000000 Binary files a/tests/visual_tests/images/marker-multi-policy-600-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 new file mode 100644 index 000000000..1532ae9c0 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-agg-reference.png 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 new file mode 100644 index 000000000..374531638 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..361576ce3 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-agg-reference.png 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 new file mode 100644 index 000000000..ad535cf89 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..33219e975 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..75362bc95 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b1427ea9e Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..22de19afc Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..58fe94ffb Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..de0885e9c Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..20d527a54 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..bf26841e8 Binary files /dev/null and b/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..fe33b15b2 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..788a1aa36 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..587ad9fe0 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..efafa2799 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-on-line-600-reference.png b/tests/visual_tests/images/marker-on-line-600-reference.png deleted file mode 100644 index b9893f537..000000000 Binary files a/tests/visual_tests/images/marker-on-line-600-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 new file mode 100644 index 000000000..d91c2f035 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..9f027d556 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4f4fc7526 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a2846c175 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..cc8483f9e Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b73700424 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b2c926dbb Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..9f2e33cb3 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-reference.png deleted file mode 100644 index fe2e75e88..000000000 Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-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 new file mode 100644 index 000000000..6b0dbe6f4 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..d02bd8e3c Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..886106880 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a7523da64 Binary files /dev/null and b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-reference.png deleted file mode 100644 index 6134492c0..000000000 Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-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 new file mode 100644 index 000000000..df73ebf66 Binary files /dev/null and b/tests/visual_tests/images/marker-path-expression-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..7efffd479 Binary files /dev/null and b/tests/visual_tests/images/marker-path-expression-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..fdf07eaae Binary files /dev/null and b/tests/visual_tests/images/marker-path-expression-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..3b77bf9f2 Binary files /dev/null and b/tests/visual_tests/images/marker-path-expression-500-100-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..624d1c9fa Binary files /dev/null and b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..a85222cf9 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..3fb174912 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..5b87d2879 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..11c31d9e0 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b480bab64 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..4d5ac73ae Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..f1ba0d7c0 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..334f9def3 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..995ef9614 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..47d03b485 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..12ae43054 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..1b6ed09ce Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-257-256-1.0-agg-reference.png 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 new file mode 100644 index 000000000..761743e75 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-257-256-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..8f44e02c0 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-257-256-2.0-agg-reference.png 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 new file mode 100644 index 000000000..018a553b7 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-257-256-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-with-background-image-257-reference.png b/tests/visual_tests/images/marker-with-background-image-257-reference.png deleted file mode 100644 index 0f00dadf2..000000000 Binary files a/tests/visual_tests/images/marker-with-background-image-257-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 new file mode 100644 index 000000000..70f35fc58 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-400-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..e991deb99 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-400-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b6e0c11c7 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-400-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a4aec0749 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-400-600-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-with-background-image-400-reference.png b/tests/visual_tests/images/marker-with-background-image-400-reference.png deleted file mode 100644 index 27ba251e0..000000000 Binary files a/tests/visual_tests/images/marker-with-background-image-400-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 new file mode 100644 index 000000000..77ab979ad Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..a7bc35af6 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..77b2dcfc3 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..784c23c62 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-with-background-image-600-reference.png b/tests/visual_tests/images/marker-with-background-image-600-reference.png deleted file mode 100644 index ac04b6668..000000000 Binary files a/tests/visual_tests/images/marker-with-background-image-600-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 new file mode 100644 index 000000000..0fe1cacfb Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-agg-reference.png 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 new file mode 100644 index 000000000..761743e75 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..f766c3a28 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-agg-reference.png 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 new file mode 100644 index 000000000..f6c31d6ca Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..7da16b1cd Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..e991deb99 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..cdc496257 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a4aec0749 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..2a65704af Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..a7bc35af6 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..22d92db8d Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..784c23c62 Binary files /dev/null and b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..bfda8136a Binary files /dev/null and b/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..8943bfa53 Binary files /dev/null and b/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..701812497 Binary files /dev/null and b/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..4cf7ae33b Binary files /dev/null and b/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker_line_placement_on_points-500-reference.png b/tests/visual_tests/images/marker_line_placement_on_points-500-reference.png deleted file mode 100644 index 71b1fb1f1..000000000 Binary files a/tests/visual_tests/images/marker_line_placement_on_points-500-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 1e0426a23..000000000 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 2b73c1c79..000000000 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 21f6e4f58..000000000 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 836393a24..000000000 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 caad4208a..000000000 Binary files a/tests/visual_tests/images/python-TextNode-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 new file mode 100644 index 000000000..dd77a0cd7 Binary files /dev/null and b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..d271f6bb1 Binary files /dev/null and b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..557ec5e24 Binary files /dev/null and b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..1f71622b3 Binary files /dev/null and b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..19af02167 Binary files /dev/null and b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-agg-reference.png 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 new file mode 100644 index 000000000..2b88ab390 Binary files /dev/null and b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..957f2b870 Binary files /dev/null and b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b34a8a5ed Binary files /dev/null and b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..398227b83 Binary files /dev/null and b/tests/visual_tests/images/rtl-point-200-200-1.0-agg-reference.png 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 new file mode 100644 index 000000000..eb53cdf4d Binary files /dev/null and b/tests/visual_tests/images/rtl-point-200-200-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..f54e061e6 Binary files /dev/null and b/tests/visual_tests/images/rtl-point-200-200-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b028a222c Binary files /dev/null and b/tests/visual_tests/images/rtl-point-200-200-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/rtl-point-200-reference.png b/tests/visual_tests/images/rtl-point-200-reference.png deleted file mode 100644 index 0d8979ed0..000000000 Binary files a/tests/visual_tests/images/rtl-point-200-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 new file mode 100644 index 000000000..7eea9485e Binary files /dev/null and b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..49bfde802 Binary files /dev/null and b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..627acd957 Binary files /dev/null and b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..61e332ddf Binary files /dev/null and b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..bcb680333 Binary files /dev/null and b/tests/visual_tests/images/shield-on-polygon-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..8ebad2380 Binary files /dev/null and b/tests/visual_tests/images/shield-on-polygon-500-100-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..b5dd8e45e Binary files /dev/null and b/tests/visual_tests/images/shield-on-polygon-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..f486e6c3e Binary files /dev/null and b/tests/visual_tests/images/shield-on-polygon-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..87fa8b772 Binary files /dev/null and b/tests/visual_tests/images/shield-on-polygon-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..0d4c6a74c Binary files /dev/null and b/tests/visual_tests/images/shield-on-polygon-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..2b9ba58dc Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..516b5f0f9 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..94211f550 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..2ee0bce91 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-490-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-490-reference.png deleted file mode 100644 index 08f62b07e..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-490-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 new file mode 100644 index 000000000..41f4b1363 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..35268e7a5 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..c94b14624 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..127e4549f Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-495-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-495-reference.png deleted file mode 100644 index 250bbaf6f..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-495-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 new file mode 100644 index 000000000..2ea1705cc Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..68edb2605 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..fd216a193 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..9baf48b12 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-497-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-497-reference.png deleted file mode 100644 index 5ba47f1b2..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-497-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 new file mode 100644 index 000000000..e287e8b0d Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..d32440728 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..e2d1ca21f Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..3bd5dd3a8 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-498-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-498-reference.png deleted file mode 100644 index 3c765f355..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-498-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 new file mode 100644 index 000000000..9ebb529c1 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..64d0fb1c0 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..76fe4cd85 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..2aea04e72 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-499-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-499-reference.png deleted file mode 100644 index ca51c98a0..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-499-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 new file mode 100644 index 000000000..0f8d25f06 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..544b04b5a Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..86b452431 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..5cd94aba9 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-500-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-500-reference.png deleted file mode 100644 index 3110abe3e..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-500-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 new file mode 100644 index 000000000..45d02d510 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..ae8e70fee Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..29a472ed2 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..f6bd195bb Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-501-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-501-reference.png deleted file mode 100644 index 62a41b8f3..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-501-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 new file mode 100644 index 000000000..cd21b7619 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..a90aadff9 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b8ba3913f Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..36cdec4a9 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-502-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-502-reference.png deleted file mode 100644 index 98ff15ecb..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-502-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 new file mode 100644 index 000000000..e8d5231fd Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..a1f5fb323 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..a889a930b Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..ef1b0489b Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-505-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-505-reference.png deleted file mode 100644 index 1977d2c6f..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-505-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 new file mode 100644 index 000000000..ea85f737f Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..5e778dba7 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..aac1ebf20 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..c1c030327 Binary files /dev/null and b/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/shieldsymbolizer-1-510-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-510-reference.png deleted file mode 100644 index d9b53a731..000000000 Binary files a/tests/visual_tests/images/shieldsymbolizer-1-510-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 new file mode 100644 index 000000000..3e1a7eff8 Binary files /dev/null and b/tests/visual_tests/images/simple-100-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..aa9c9ac26 Binary files /dev/null and b/tests/visual_tests/images/simple-100-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b72569843 Binary files /dev/null and b/tests/visual_tests/images/simple-100-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..e3cfc2be0 Binary files /dev/null and b/tests/visual_tests/images/simple-100-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-100-reference.png b/tests/visual_tests/images/simple-100-reference.png deleted file mode 100644 index 4efb11cf5..000000000 Binary files a/tests/visual_tests/images/simple-100-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 new file mode 100644 index 000000000..8fa7ed8ae Binary files /dev/null and b/tests/visual_tests/images/simple-150-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..22ebcedd4 Binary files /dev/null and b/tests/visual_tests/images/simple-150-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..1348abcd6 Binary files /dev/null and b/tests/visual_tests/images/simple-150-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..4ba583ec2 Binary files /dev/null and b/tests/visual_tests/images/simple-150-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-150-reference.png b/tests/visual_tests/images/simple-150-reference.png deleted file mode 100644 index ef7e43db5..000000000 Binary files a/tests/visual_tests/images/simple-150-reference.png and /dev/null differ diff --git a/tests/visual_tests/images/simple-200-reference.png b/tests/visual_tests/images/simple-200-reference.png deleted file mode 100644 index 46f956ae2..000000000 Binary files a/tests/visual_tests/images/simple-200-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 new file mode 100644 index 000000000..a43a48355 Binary files /dev/null and b/tests/visual_tests/images/simple-250-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..e247fb3e0 Binary files /dev/null and b/tests/visual_tests/images/simple-250-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..1c40458d5 Binary files /dev/null and b/tests/visual_tests/images/simple-250-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..aa91d6a4c Binary files /dev/null and b/tests/visual_tests/images/simple-250-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-250-reference.png b/tests/visual_tests/images/simple-250-reference.png deleted file mode 100644 index a5747fa76..000000000 Binary files a/tests/visual_tests/images/simple-250-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 new file mode 100644 index 000000000..79d388525 Binary files /dev/null and b/tests/visual_tests/images/simple-300-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..37650c72f Binary files /dev/null and b/tests/visual_tests/images/simple-300-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..e86daa75f Binary files /dev/null and b/tests/visual_tests/images/simple-300-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..901d45f9c Binary files /dev/null and b/tests/visual_tests/images/simple-300-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-300-reference.png b/tests/visual_tests/images/simple-300-reference.png deleted file mode 100644 index 097f86700..000000000 Binary files a/tests/visual_tests/images/simple-300-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 new file mode 100644 index 000000000..11b03ca05 Binary files /dev/null and b/tests/visual_tests/images/simple-400-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..f34cb9a8e Binary files /dev/null and b/tests/visual_tests/images/simple-400-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b9efaa379 Binary files /dev/null and b/tests/visual_tests/images/simple-400-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..aab6f1a33 Binary files /dev/null and b/tests/visual_tests/images/simple-400-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-400-reference.png b/tests/visual_tests/images/simple-400-reference.png deleted file mode 100644 index fc481ae44..000000000 Binary files a/tests/visual_tests/images/simple-400-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 new file mode 100644 index 000000000..ba094f58c Binary files /dev/null and b/tests/visual_tests/images/simple-600-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..1a41fd780 Binary files /dev/null and b/tests/visual_tests/images/simple-600-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..5f32ee63e Binary files /dev/null and b/tests/visual_tests/images/simple-600-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..653b3e6de Binary files /dev/null and b/tests/visual_tests/images/simple-600-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-600-reference.png b/tests/visual_tests/images/simple-600-reference.png deleted file mode 100644 index 8cbe5bae8..000000000 Binary files a/tests/visual_tests/images/simple-600-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 new file mode 100644 index 000000000..224f42e98 Binary files /dev/null and b/tests/visual_tests/images/simple-800-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..2bf3a1b44 Binary files /dev/null and b/tests/visual_tests/images/simple-800-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..d1f9fcdf9 Binary files /dev/null and b/tests/visual_tests/images/simple-800-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..644d3549e Binary files /dev/null and b/tests/visual_tests/images/simple-800-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-800-reference.png b/tests/visual_tests/images/simple-800-reference.png deleted file mode 100644 index 25fde97ca..000000000 Binary files a/tests/visual_tests/images/simple-800-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 new file mode 100644 index 000000000..daba51ba2 Binary files /dev/null and b/tests/visual_tests/images/simple-E-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..daba51ba2 Binary files /dev/null and b/tests/visual_tests/images/simple-E-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..c1d8dd1c7 Binary files /dev/null and b/tests/visual_tests/images/simple-E-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..08beb2951 Binary files /dev/null and b/tests/visual_tests/images/simple-E-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-E-500-reference.png b/tests/visual_tests/images/simple-E-500-reference.png deleted file mode 100644 index df6a0a3b1..000000000 Binary files a/tests/visual_tests/images/simple-E-500-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 new file mode 100644 index 000000000..49c6748ca Binary files /dev/null and b/tests/visual_tests/images/simple-N-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..49c6748ca Binary files /dev/null and b/tests/visual_tests/images/simple-N-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..71cb4abde Binary files /dev/null and b/tests/visual_tests/images/simple-N-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..e3b64c3f5 Binary files /dev/null and b/tests/visual_tests/images/simple-N-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-N-500-reference.png b/tests/visual_tests/images/simple-N-500-reference.png deleted file mode 100644 index c2835a1fb..000000000 Binary files a/tests/visual_tests/images/simple-N-500-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 new file mode 100644 index 000000000..bb993126a Binary files /dev/null and b/tests/visual_tests/images/simple-NE-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..bb993126a Binary files /dev/null and b/tests/visual_tests/images/simple-NE-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..e2b538a30 Binary files /dev/null and b/tests/visual_tests/images/simple-NE-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..ff74eabfe Binary files /dev/null and b/tests/visual_tests/images/simple-NE-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-NE-500-reference.png b/tests/visual_tests/images/simple-NE-500-reference.png deleted file mode 100644 index b4da1afb8..000000000 Binary files a/tests/visual_tests/images/simple-NE-500-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 new file mode 100644 index 000000000..defbef89a Binary files /dev/null and b/tests/visual_tests/images/simple-NW-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..defbef89a Binary files /dev/null and b/tests/visual_tests/images/simple-NW-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..20ea0281d Binary files /dev/null and b/tests/visual_tests/images/simple-NW-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..0b8241797 Binary files /dev/null and b/tests/visual_tests/images/simple-NW-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-NW-500-reference.png b/tests/visual_tests/images/simple-NW-500-reference.png deleted file mode 100644 index 36f86c522..000000000 Binary files a/tests/visual_tests/images/simple-NW-500-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 new file mode 100644 index 000000000..e3cbe05dd Binary files /dev/null and b/tests/visual_tests/images/simple-S-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..e3cbe05dd Binary files /dev/null and b/tests/visual_tests/images/simple-S-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..1cd7afd04 Binary files /dev/null and b/tests/visual_tests/images/simple-S-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a164caf35 Binary files /dev/null and b/tests/visual_tests/images/simple-S-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-S-500-reference.png b/tests/visual_tests/images/simple-S-500-reference.png deleted file mode 100644 index 07dd889db..000000000 Binary files a/tests/visual_tests/images/simple-S-500-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 new file mode 100644 index 000000000..9c7cb25f7 Binary files /dev/null and b/tests/visual_tests/images/simple-SE-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..9c7cb25f7 Binary files /dev/null and b/tests/visual_tests/images/simple-SE-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..9f151a464 Binary files /dev/null and b/tests/visual_tests/images/simple-SE-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..02c19d92f Binary files /dev/null and b/tests/visual_tests/images/simple-SE-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-SE-500-reference.png b/tests/visual_tests/images/simple-SE-500-reference.png deleted file mode 100644 index 7ebab2a95..000000000 Binary files a/tests/visual_tests/images/simple-SE-500-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 new file mode 100644 index 000000000..558a45ae1 Binary files /dev/null and b/tests/visual_tests/images/simple-SW-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..558a45ae1 Binary files /dev/null and b/tests/visual_tests/images/simple-SW-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..fa17e300d Binary files /dev/null and b/tests/visual_tests/images/simple-SW-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b71f444a6 Binary files /dev/null and b/tests/visual_tests/images/simple-SW-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-SW-500-reference.png b/tests/visual_tests/images/simple-SW-500-reference.png deleted file mode 100644 index a69999da0..000000000 Binary files a/tests/visual_tests/images/simple-SW-500-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 new file mode 100644 index 000000000..0a6b57622 Binary files /dev/null and b/tests/visual_tests/images/simple-W-500-100-1.0-agg-reference.png 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 new file mode 100644 index 000000000..0a6b57622 Binary files /dev/null and b/tests/visual_tests/images/simple-W-500-100-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..5a19d58c3 Binary files /dev/null and b/tests/visual_tests/images/simple-W-500-100-2.0-agg-reference.png 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 new file mode 100644 index 000000000..e49aeef21 Binary files /dev/null and b/tests/visual_tests/images/simple-W-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/simple-W-500-reference.png b/tests/visual_tests/images/simple-W-500-reference.png deleted file mode 100644 index 8e198986b..000000000 Binary files a/tests/visual_tests/images/simple-W-500-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 new file mode 100644 index 000000000..8ba187dd9 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-agg-reference.png 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 new file mode 100644 index 000000000..9a6e6d63c Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..8ba187dd9 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-agg-reference.png 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 new file mode 100644 index 000000000..9a6e6d63c Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..2ecb9eeb5 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-agg-reference.png 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 new file mode 100644 index 000000000..cc2ac3130 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..2ecb9eeb5 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-agg-reference.png 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 new file mode 100644 index 000000000..cc2ac3130 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..e60124056 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-agg-reference.png 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 new file mode 100644 index 000000000..cdd138e47 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..e60124056 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-agg-reference.png 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 new file mode 100644 index 000000000..cdd138e47 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..0e1cd5b09 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-agg-reference.png 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 new file mode 100644 index 000000000..ad745d737 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..0e1cd5b09 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-agg-reference.png 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 new file mode 100644 index 000000000..ad745d737 Binary files /dev/null and b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..5940a1f7c Binary files /dev/null and b/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..05bb4b852 Binary files /dev/null and b/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..bf705898f Binary files /dev/null and b/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b4fd03c35 Binary files /dev/null and b/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..df3725329 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..df3725329 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..df3725329 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..df3725329 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-reference.png b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-reference.png deleted file mode 100644 index 3c79bb304..000000000 Binary files a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-reference.png and /dev/null differ diff --git a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-raster-600-reference.png b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-raster-600-reference.png deleted file mode 100644 index 3c79bb304..000000000 Binary files a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-raster-600-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 new file mode 100644 index 000000000..eb2a80da5 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..eb2a80da5 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..eb2a80da5 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..eb2a80da5 Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-alpha-gdal-600-reference.png b/tests/visual_tests/images/tiff-alpha-gdal-600-reference.png deleted file mode 100644 index 0bb7ff1cf..000000000 Binary files a/tests/visual_tests/images/tiff-alpha-gdal-600-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 new file mode 100644 index 000000000..77bd59f7d Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..77bd59f7d Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..77bd59f7d Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..77bd59f7d Binary files /dev/null and b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-reference.png b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-reference.png deleted file mode 100644 index 92c3aaf2d..000000000 Binary files a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-reference.png and /dev/null differ diff --git a/tests/visual_tests/images/tiff-alpha-gradient-raster-600-reference.png b/tests/visual_tests/images/tiff-alpha-gradient-raster-600-reference.png deleted file mode 100644 index 92c3aaf2d..000000000 Binary files a/tests/visual_tests/images/tiff-alpha-gradient-raster-600-reference.png and /dev/null differ diff --git a/tests/visual_tests/images/tiff-alpha-raster-600-reference.png b/tests/visual_tests/images/tiff-alpha-raster-600-reference.png deleted file mode 100644 index 0bb7ff1cf..000000000 Binary files a/tests/visual_tests/images/tiff-alpha-raster-600-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 new file mode 100644 index 000000000..cf37ac7d3 Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-agg-reference.png 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 new file mode 100644 index 000000000..cf37ac7d3 Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..cf37ac7d3 Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-agg-reference.png 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 new file mode 100644 index 000000000..cf37ac7d3 Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..181f49f2d Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-agg-reference.png 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 new file mode 100644 index 000000000..181f49f2d Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..181f49f2d Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-agg-reference.png 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 new file mode 100644 index 000000000..181f49f2d Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..562f0071e Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-agg-reference.png 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 new file mode 100644 index 000000000..562f0071e Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..562f0071e Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-agg-reference.png 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 new file mode 100644 index 000000000..562f0071e Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..dbf4ebecd Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-agg-reference.png 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 new file mode 100644 index 000000000..dbf4ebecd Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..dbf4ebecd Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-agg-reference.png 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 new file mode 100644 index 000000000..dbf4ebecd Binary files /dev/null and b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..2d09d345b Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..2d09d345b Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..2d09d345b Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..2d09d345b Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-reference.png deleted file mode 100644 index df5fa419e..000000000 Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-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 new file mode 100644 index 000000000..16a62306c Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-agg-reference.png 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 new file mode 100644 index 000000000..16a62306c Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..16a62306c Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-agg-reference.png 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 new file mode 100644 index 000000000..16a62306c Binary files /dev/null and b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-nodata-edge-raster-600-reference.png b/tests/visual_tests/images/tiff-nodata-edge-raster-600-reference.png deleted file mode 100644 index df5fa419e..000000000 Binary files a/tests/visual_tests/images/tiff-nodata-edge-raster-600-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 new file mode 100644 index 000000000..fa01319a8 Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-agg-reference.png 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 new file mode 100644 index 000000000..fa01319a8 Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..fa01319a8 Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-agg-reference.png 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 new file mode 100644 index 000000000..fa01319a8 Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-reference.png deleted file mode 100644 index 682024a6e..000000000 Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..faebe7ecd Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..faebe7ecd Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..faebe7ecd Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..faebe7ecd Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-reference.png deleted file mode 100644 index 9c5822705..000000000 Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster-256-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster-256-reference.png deleted file mode 100644 index 682024a6e..000000000 Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster-256-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 new file mode 100644 index 000000000..dafaec41d Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..081e14c8d Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..dafaec41d Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..081e14c8d Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-reference.png deleted file mode 100644 index de98ce206..000000000 Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-agg-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-agg-reference.png 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 new file mode 100644 index 000000000..b23e716ab Binary files /dev/null and b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..f0945b124 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-agg-reference.png 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 new file mode 100644 index 000000000..71df304f2 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..f0945b124 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-agg-reference.png 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 new file mode 100644 index 000000000..71df304f2 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..dff3b1b36 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-agg-reference.png 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 new file mode 100644 index 000000000..dff3b1b36 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..dff3b1b36 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-agg-reference.png 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 new file mode 100644 index 000000000..dff3b1b36 Binary files /dev/null and b/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-cairo-reference.png 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 new file mode 100644 index 000000000..cb6a7b939 Binary files /dev/null and b/tests/visual_tests/images/tiff-resampling-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..44906bee9 Binary files /dev/null and b/tests/visual_tests/images/tiff-resampling-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..cb6a7b939 Binary files /dev/null and b/tests/visual_tests/images/tiff-resampling-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..44906bee9 Binary files /dev/null and b/tests/visual_tests/images/tiff-resampling-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/tiff-resampling-600-reference.png b/tests/visual_tests/images/tiff-resampling-600-reference.png deleted file mode 100644 index a355ac3d5..000000000 Binary files a/tests/visual_tests/images/tiff-resampling-600-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 new file mode 100644 index 000000000..e652f39af Binary files /dev/null and b/tests/visual_tests/images/whole-centroid-600-400-1.0-agg-reference.png 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 new file mode 100644 index 000000000..35f2d678e Binary files /dev/null and b/tests/visual_tests/images/whole-centroid-600-400-1.0-cairo-reference.png 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 new file mode 100644 index 000000000..a0b50f706 Binary files /dev/null and b/tests/visual_tests/images/whole-centroid-600-400-2.0-agg-reference.png 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 new file mode 100644 index 000000000..a57d61ece Binary files /dev/null and b/tests/visual_tests/images/whole-centroid-600-400-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/whole-centroid-600-reference.png b/tests/visual_tests/images/whole-centroid-600-reference.png deleted file mode 100644 index 500bd4c9d..000000000 Binary files a/tests/visual_tests/images/whole-centroid-600-reference.png and /dev/null differ diff --git a/tests/visual_tests/styles/collision.xml b/tests/visual_tests/styles/collision.xml index 3bd807de0..7b717fc9f 100644 --- a/tests/visual_tests/styles/collision.xml +++ b/tests/visual_tests/styles/collision.xml @@ -9,6 +9,7 @@ diff --git a/tests/visual_tests/styles/expressionformat.xml b/tests/visual_tests/styles/expressionformat.xml index 919430f97..81c7b65c3 100644 --- a/tests/visual_tests/styles/expressionformat.xml +++ b/tests/visual_tests/styles/expressionformat.xml @@ -5,8 +5,8 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv diff --git a/tests/visual_tests/styles/formatting-1.xml b/tests/visual_tests/styles/formatting-1.xml index 15f512abf..7bb62f15f 100644 --- a/tests/visual_tests/styles/formatting-1.xml +++ b/tests/visual_tests/styles/formatting-1.xml @@ -5,8 +5,8 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv diff --git a/tests/visual_tests/styles/formatting-2.xml b/tests/visual_tests/styles/formatting-2.xml index 635af6a39..ca7646a47 100644 --- a/tests/visual_tests/styles/formatting-2.xml +++ b/tests/visual_tests/styles/formatting-2.xml @@ -5,8 +5,8 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv diff --git a/tests/visual_tests/styles/formatting-3.xml b/tests/visual_tests/styles/formatting-3.xml index 97a5fb1f2..eb9e449fe 100644 --- a/tests/visual_tests/styles/formatting-3.xml +++ b/tests/visual_tests/styles/formatting-3.xml @@ -5,8 +5,8 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv diff --git a/tests/visual_tests/styles/formatting-4.xml b/tests/visual_tests/styles/formatting-4.xml index b09f59a26..984a654fb 100644 --- a/tests/visual_tests/styles/formatting-4.xml +++ b/tests/visual_tests/styles/formatting-4.xml @@ -5,8 +5,8 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv diff --git a/tests/visual_tests/styles/gdal-filter-factor.xml b/tests/visual_tests/styles/gdal-filter-factor.xml new file mode 100644 index 000000000..22554e31d --- /dev/null +++ b/tests/visual_tests/styles/gdal-filter-factor.xml @@ -0,0 +1,17 @@ + + + + + + test + + ../data/Yosemite_L9.tif + gdal + + + + \ No newline at end of file diff --git a/tests/visual_tests/styles/geometry-transform-translate.xml b/tests/visual_tests/styles/geometry-transform-translate.xml new file mode 100644 index 000000000..ee0344cd8 --- /dev/null +++ b/tests/visual_tests/styles/geometry-transform-translate.xml @@ -0,0 +1,100 @@ + + + + + + + + polygon + + csv + +wkt +"POLYGON ((1 1, 4 1, 4 4, 1 4, 1 1), (2 2, 2 3, 3 3, 3 2, 2 2))" + + + + + + line + + csv + +wkt +"LINESTRING (0.5 0.5, 4.5 4.5)" + + + + + + point + + csv + +wkt +"POINT (1 4)" + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + diff --git a/tests/visual_tests/styles/jalign-auto.xml b/tests/visual_tests/styles/jalign-auto.xml index f59f31cba..2ee79edd5 100644 --- a/tests/visual_tests/styles/jalign-auto.xml +++ b/tests/visual_tests/styles/jalign-auto.xml @@ -5,14 +5,14 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv diff --git a/tests/visual_tests/styles/lines-1.xml b/tests/visual_tests/styles/lines-1.xml index dfd534efb..086f99205 100644 --- a/tests/visual_tests/styles/lines-1.xml +++ b/tests/visual_tests/styles/lines-1.xml @@ -5,13 +5,14 @@ My Style - osm - ../data/lines.osm + csv + ../data/lines.csv + + 1 + + shape + ../data/hex.shp + + + +
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 new file mode 100644 index 000000000..3469cc24b --- /dev/null +++ b/tests/visual_tests/styles/marker-on-line-and-line-placement.xml @@ -0,0 +1,22 @@ + + + + + line + point-placement + + csv + ../data/marker-on-line.csv + | + + + diff --git a/tests/visual_tests/styles/marker-path-expression.xml b/tests/visual_tests/styles/marker-path-expression.xml new file mode 100644 index 000000000..1884e2b8f --- /dev/null +++ b/tests/visual_tests/styles/marker-path-expression.xml @@ -0,0 +1,42 @@ + + + + + + ellipse + + csv + +x,y,FILENAME,FILETYPE +2.5,2.5,rect2,svg + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ No newline at end of file diff --git a/tests/visual_tests/styles/marker-svg-empty-g-element.xml b/tests/visual_tests/styles/marker-svg-empty-g-element.xml new file mode 100644 index 000000000..2ac50c303 --- /dev/null +++ b/tests/visual_tests/styles/marker-svg-empty-g-element.xml @@ -0,0 +1,42 @@ + + + + + + svg + + csv + +x,y +2.5,2.5 + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ 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 new file mode 100644 index 000000000..43a00467b --- /dev/null +++ b/tests/visual_tests/styles/marker-svg-opacity.xml @@ -0,0 +1,58 @@ + + + + + + ellipse + + csv + +x,y,id +1,1,1 +2,2,2 +3,3,3 +4,4,4 + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ 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 new file mode 100644 index 000000000..620b491d3 --- /dev/null +++ b/tests/visual_tests/styles/marker-svg-opacity2.xml @@ -0,0 +1,42 @@ + + + + + + svg + + csv + +x,y +2.5,2.5 + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ 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 new file mode 100644 index 000000000..4d691fbaa --- /dev/null +++ b/tests/visual_tests/styles/marker-with-background-image-and-hsla-transform.xml @@ -0,0 +1,69 @@ + + + + + + ellipse + + csv + +x,y +2.5,2.5 + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ No newline at end of file diff --git a/tests/visual_tests/styles/road-casings-grouped-rendering.xml b/tests/visual_tests/styles/road-casings-grouped-rendering.xml new file mode 100644 index 000000000..49b490e3f --- /dev/null +++ b/tests/visual_tests/styles/road-casings-grouped-rendering.xml @@ -0,0 +1,69 @@ + + + + + + + + + + casing + bridge + fill + marking + + ../data/grouped-rendering.sqlite + (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 + sqlite + + + + \ 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 new file mode 100644 index 000000000..3d29d93ee --- /dev/null +++ b/tests/visual_tests/styles/road-casings-non-grouped-rendering.xml @@ -0,0 +1,67 @@ + + + + + + + + + + casing + bridge + fill + marking + + ../data/grouped-rendering.sqlite + (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 + sqlite + + + + \ No newline at end of file diff --git a/tests/visual_tests/styles/rtl-point.xml b/tests/visual_tests/styles/rtl-point.xml index ac765b488..5236f94ee 100644 --- a/tests/visual_tests/styles/rtl-point.xml +++ b/tests/visual_tests/styles/rtl-point.xml @@ -5,14 +5,14 @@ My Style - osm - ../data/points.osm + csv + ../data/points.csv + + +
\ 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 new file mode 100644 index 000000000..c4f2f9e55 --- /dev/null +++ b/tests/visual_tests/styles/shield-on-polygon.xml @@ -0,0 +1,49 @@ + + + + + + -180,-85.05112877980659,180,85.05112877980659 + 0,0,2 + png + 0 + 22 + + + + + + + countries-outline + countries + + ../../data/shp/new_zealand/ne_50m_land.shp + + + + + + + places + + ../../data/shp/new_zealand/ne_50m_populated_places_simple.shp + + + + + \ No newline at end of file diff --git a/tests/visual_tests/styles/shieldsymbolizer-1.xml b/tests/visual_tests/styles/shieldsymbolizer-1.xml index 815f22920..0af96590a 100644 --- a/tests/visual_tests/styles/shieldsymbolizer-1.xml +++ b/tests/visual_tests/styles/shieldsymbolizer-1.xml @@ -1,54 +1,55 @@ + My Style - osm - ../data/points.osm + csv + ../data/points.csv 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 new file mode 100644 index 000000000..f1fab7b69 --- /dev/null +++ b/tests/visual_tests/styles/style-level-compositing-tiled-0,0.xml @@ -0,0 +1,30 @@ + + + + style + + ../../data/shp/world_merc + shape + + + + + + mask + + + wkt,name + "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds" + + csv + + + \ 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 new file mode 100644 index 000000000..f1fab7b69 --- /dev/null +++ b/tests/visual_tests/styles/style-level-compositing-tiled-0,1.xml @@ -0,0 +1,30 @@ + + + + style + + ../../data/shp/world_merc + shape + + + + + + mask + + + wkt,name + "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds" + + csv + + + \ 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 new file mode 100644 index 000000000..f1fab7b69 --- /dev/null +++ b/tests/visual_tests/styles/style-level-compositing-tiled-1,0.xml @@ -0,0 +1,30 @@ + + + + style + + ../../data/shp/world_merc + shape + + + + + + mask + + + wkt,name + "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds" + + csv + + + \ 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 new file mode 100644 index 000000000..f1fab7b69 --- /dev/null +++ b/tests/visual_tests/styles/style-level-compositing-tiled-1,1.xml @@ -0,0 +1,30 @@ + + + + style + + ../../data/shp/world_merc + shape + + + + + + mask + + + wkt,name + "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds" + + csv + + + \ No newline at end of file diff --git a/tests/visual_tests/styles/text-halo-rasterizer.xml b/tests/visual_tests/styles/text-halo-rasterizer.xml new file mode 100644 index 000000000..cefcadb02 --- /dev/null +++ b/tests/visual_tests/styles/text-halo-rasterizer.xml @@ -0,0 +1,224 @@ + + + + + + labels + + csv + +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 + + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ 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 new file mode 100644 index 000000000..0c18e088f --- /dev/null +++ b/tests/visual_tests/styles/tiff-edge-alignment-gdal1.xml @@ -0,0 +1,17 @@ + + + + + + test + + ../data/Yosemite_L9.tif + gdal + + + + \ 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 new file mode 100644 index 000000000..0c18e088f --- /dev/null +++ b/tests/visual_tests/styles/tiff-edge-alignment-gdal2.xml @@ -0,0 +1,17 @@ + + + + + + test + + ../data/Yosemite_L9.tif + gdal + + + + \ 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 new file mode 100644 index 000000000..66519f990 --- /dev/null +++ b/tests/visual_tests/styles/tiff-reprojection-1.xml @@ -0,0 +1,15 @@ + + + + heat + + ../data/heat.tif + gdal + + + \ 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 new file mode 100644 index 000000000..0c3520c39 --- /dev/null +++ b/tests/visual_tests/styles/tiff-reprojection-2.xml @@ -0,0 +1,19 @@ + + + + + + + samp1 + + ../data/lower_columbia.tif + gdal + + + + \ No newline at end of file diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py index 48b2212e6..bdce97563 100755 --- a/tests/visual_tests/test.py +++ b/tests/visual_tests/test.py @@ -4,9 +4,10 @@ import mapnik mapnik.logger.set_severity(mapnik.severity_type.None) +import shutil import sys import os.path -from compare import compare, compare_grids, summary, fail +from compare import compare, compare_grids try: import json @@ -16,9 +17,57 @@ except ImportError: visual_output_dir = "/tmp/mapnik-visual-images" defaults = { - 'sizes': [(500, 100)] + 'sizes': [(500, 100)], + 'scales':[1.0,2.0], + 'agg': True, + 'cairo': mapnik.has_cairo(), + 'grid': mapnik.has_grid_renderer() } +cairo_threshold = 10 +if 'Linux' == os.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 = 120 + +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) + utf1 = grid.encode('utf', resolution=4) + open(output,'wb').write(json.dumps(utf1, indent=1)) + +renderers = [ + { 'name': 'agg', + 'render': lambda m, output, scale_factor: mapnik.render_to_file(m, output, 'png8:m=h', scale_factor), + 'compare': lambda actual, reference: compare(actual, reference, alpha=True), + 'threshold': 0, + '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': 0, + 'filetype': 'json', + 'dir': 'grids' + } +] + sizes_many_in_big_range = [(800, 100), (600, 100), (400, 100), (300, 100), (250, 100), (150, 100), (100, 100)] @@ -28,74 +77,220 @@ sizes_many_in_small_range = [(490, 100), (495, 100), (497, 100), (498, 100), default_text_box = mapnik.Box2d(-0.05, -0.01, 0.95, 0.01) +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 = [ - {'name': "list", 'sizes': sizes_many_in_big_range,'bbox':default_text_box}, - {'name': "simple", 'sizes': sizes_many_in_big_range,'bbox':default_text_box}, - {'name': "lines-1", 'sizes': sizes_few_square,'bbox':default_text_box}, - {'name': "lines-2", 'sizes': sizes_few_square,'bbox':default_text_box}, - {'name': "lines-3", 'sizes': sizes_few_square,'bbox':default_text_box}, - {'name': "lines-shield", 'sizes': sizes_few_square,'bbox':default_text_box}, - {'name': "collision", 'sizes':[(600,400)]}, - {'name': "marker-multi-policy", 'sizes':[(600,400)]}, - {'name': "marker-on-line", 'sizes':[(600,400)], +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-shield': {'sizes': sizes_few_square,'bbox':default_text_box}, + 'collision': {'sizes':[(600,400)]}, + 'shield-on-polygon': {'sizes':[(600,400)]}, + 'shield-on-line-spacing-eq-width': {'sizes':[(600,400)]}, + 'geometry-transform-translate': {'sizes':[(200,200)]}, + '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)}, - {'name': "marker-on-line-spacing-eq-width", 'sizes':[(600,400)]}, - {'name': "marker-on-line-spacing-eq-width-overlap", 'sizes':[(600,400)]}, - {'name': "marker_line_placement_on_points"}, - {'name': "marker-with-background-image", 'sizes':[(600,400),(400,600),(257,256)]}, - {'name': "whole-centroid", 'sizes':[(600,400)], + '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-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)}, - {'name': "simple-E", 'bbox':mapnik.Box2d(-0.05, -0.01, 0.95, 0.01)}, - {'name': "simple-NE",'bbox':default_text_box}, - {'name': "simple-NW",'bbox':default_text_box}, - {'name': "simple-N",'bbox':default_text_box}, - {'name': "simple-SE",'bbox':default_text_box}, - {'name': "simple-SW",'bbox':default_text_box}, - {'name': "simple-S",'bbox':default_text_box}, - {'name': "simple-W",'bbox':default_text_box}, - {'name': "formatting-1",'bbox':default_text_box}, - {'name': "formatting-2",'bbox':default_text_box}, - {'name': "formatting-3",'bbox':default_text_box}, - {'name': "formatting-4",'bbox':default_text_box}, - {'name': "expressionformat",'bbox':default_text_box}, - {'name': "shieldsymbolizer-1", 'sizes': sizes_many_in_small_range,'bbox':default_text_box}, - {'name': "rtl-point", 'sizes': [(200, 200)],'bbox':default_text_box}, - {'name': "jalign-auto", 'sizes': [(200, 200)],'bbox':default_text_box}, - {'name': "line-offset", 'sizes':[(900, 250)],'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)}, - {'name': "tiff-alpha-gdal", 'sizes':[(600,400)]}, - {'name': "tiff-alpha-broken-assoc-alpha-gdal", 'sizes':[(600,400)]}, - {'name': "tiff-alpha-gradient-gdal", 'sizes':[(600,400)]}, - {'name': "tiff-nodata-edge-gdal", 'sizes':[(600,400)]}, - {'name': "tiff-opaque-edge-gdal", 'sizes':[(256,256)]}, - {'name': "tiff-opaque-edge-gdal2", 'sizes':[(600,400)]}, - {'name': "tiff-opaque-edge-raster2", 'sizes':[(600,400)]}, - {'name': "tiff-resampling", 'sizes':[(600,400)]}, + 'text-halo-rasterizer': {'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}, + 'expressionformat': {'bbox':default_text_box}, + 'shieldsymbolizer-1': {'sizes': sizes_many_in_small_range,'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)}, + '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)]}, + + # disabled since fixing is not actionable: https://github.com/mapnik/mapnik/issues/1913 + #'tiff-reprojection-2': {'sizes':[(250,250)]}, + # https://github.com/mapnik/mapnik/issues/1520 # commented because these are not critical failures - #{'name': "tiff-alpha-raster", 'sizes':[(600,400)]}, - #{'name': "tiff-alpha-broken-assoc-alpha-raster", 'sizes':[(600,400)]}, - #{'name': "tiff-nodata-edge-raster", 'sizes':[(600,400)]}, - #{'name': "tiff-opaque-edge-raster", 'sizes':[(256,256)]}, - ] + #'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)]}, + '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':{} + } -def report(diff,quiet=False,threshold=0): - if diff > threshold: - if quiet: +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: sys.stderr.write('\x1b[31m.\x1b[0m') else: print '\x1b[31m✘\x1b[0m (\x1b[34m%u different pixels\x1b[0m)' % diff - else: - if quiet: + + 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: sys.stderr.write('\x1b[32m.\x1b[0m') else: print '\x1b[32m✓\x1b[0m' -def render(filename, width, height, bbox, quiet=False): + 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 = ''' +
+ + + +
+ ''' % (expected,expected,'%') + item += '
%s
' % (diff) + item += ''' +
+ + + +
+ ''' % (actual,actual,'%') + return item + + def summary(self): + if self.passed == 0: + print '\nNOTICE: No valid visual tests were run' + return 0 + 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) - expected = os.path.join(dirname, "images", '%s-%d-reference.png' % (filename, width)) - actual = '%s-%d' % (filename, width) + postfix = "%s-%d-%d-%s" % (filename, width, height, scale_factor) + try: mapnik.load_map(m, os.path.join(dirname, "styles", "%s.xml" % filename), False) if bbox is not None: @@ -103,59 +298,34 @@ def render(filename, width, height, bbox, quiet=False): else: m.zoom_all() except Exception, e: - sys.stderr.write(e.message + '\n') - fail(actual,expected,str(e.message)) - return - actual_agg = os.path.join(visual_output_dir, '%s-agg.png' % actual) - if not quiet: - print "\"%s\" with size %dx%d with agg..." % (filename, width, height), + if 'Could not create datasource' in str(e): + return m + reporting.other_error(filename, repr(e)) + return m - try: - mapnik.render_to_file(m, actual_agg) - if not os.path.exists(expected): - # generate it on the fly - fail(actual_agg,expected,None) - else: - diff = compare(actual_agg, expected, threshold=1, alpha=True) - report(diff,quiet) - except Exception, e: - sys.stderr.write(e.message + '\n') - fail(actual_agg,expected,str(e.message)) - if 'tiff' in actual or 'marker' in actual: - actual_cairo = os.path.join(visual_output_dir, '%s-cairo.png' % actual) - if not quiet: - print "\"%s\" with size %dx%d with cairo..." % (filename, width, height), - try: - mapnik.render_to_file(m, actual_cairo,'ARGB32') - if not os.path.exists(expected): - pass # will have been generated by agg test - else: - # cairo and agg differ in alpha for reasons unknown, so don't test it for now - diff_threshold = 4 - diff = compare(actual_cairo, expected, threshold=diff_threshold, alpha=False) - report(diff,quiet,threshold=diff_threshold) - except Exception, e: - sys.stderr.write(e.message + '\n') - fail(actual_cairo,expected,str(e.message)) - if True: - expected_grid = os.path.join(dirname, "grids", '%s-%d-reference.json' % (filename, width)) - actual_grid = os.path.join(visual_output_dir, '%s-grid.json' % actual) - if not quiet: - print "\"%s\" with size %dx%d with grid..." % (filename, width, height), - try: - grid = mapnik.Grid(m.width,m.height) - mapnik.render_layer(m,grid,layer=0) - utf1 = grid.encode('utf',resolution=4) - open(actual_grid,'wb').write(json.dumps(utf1,indent=2)) - if not os.path.exists(expected_grid): - # generate it on the fly - fail(actual_grid,expected_grid,None) - else: - diff = compare_grids(actual_grid, expected_grid, threshold=1, alpha=False) - report(diff,quiet) - except Exception, e: - sys.stderr.write(e.message + '\n') - fail(actual_grid,expected,str(e.message)) + for renderer in renderers: + # TODO - grid renderer does not support scale_factor yet via python + if renderer['name'] == 'grid' and scale_factor != 1.0: + continue + 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__": @@ -165,22 +335,38 @@ if __name__ == "__main__": else: quiet = False - if len(sys.argv) == 2: - files = [{"name": sys.argv[1], "sizes": sizes_few_square}] - elif len(sys.argv) > 2: - files = [] + 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:]: - files.append({"name": name}) + 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) - if 'osm' in mapnik.DatasourceCache.plugin_names(): - for f in files: - config = dict(defaults) - config.update(f) - for size in config['sizes']: - m = render(config['name'], size[0], size[1], config.get('bbox'), quiet=quiet) - mapnik.save_map(m, os.path.join(dirname, 'xml_output', "%s-out.xml" % config['name'])) + reporting = Reporting(quiet, overwrite_failures) + 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)) - summary(generate=True) + sys.exit(reporting.summary()) diff --git a/tests/visual_tests/test_python.py b/tests/visual_tests/test_python.py index 00857fbd1..ac5165c1d 100755 --- a/tests/visual_tests/test_python.py +++ b/tests/visual_tests/test_python.py @@ -71,7 +71,7 @@ m.append_style('Style', style) layer = mapnik.Layer('Layer') -layer.datasource = mapnik.Osm(file=os.path.join(dirname,"data/points.osm")) +layer.datasource = mapnik.Datasource(**{file=os.path.join(dirname,"data/points.csv")) layer.styles.append('Style') m.layers.append(layer) @@ -85,7 +85,7 @@ formatnode.fill = mapnik.Color("green") format_trees = [ ('TextNode', mapnik.FormattingText("[name]")), ('MyText', MyText()), - ('IfElse', IfElse("[nr] != '5'", + ('IfElse', IfElse("[nr] != 5", mapnik.FormattingText("[name]"), mapnik.FormattingText("'SPECIAL!'"))), ('Format', formatnode), diff --git a/utils/format_source_files/format_source_files.sh b/utils/format_source_files/format_source_files.sh index 90dc8fef7..c4dd8d25a 100755 --- a/utils/format_source_files/format_source_files.sh +++ b/utils/format_source_files/format_source_files.sh @@ -3,12 +3,11 @@ # batch format *.{hpp,cpp} files MAPNIK_DIR=`pwd` -DIRS="$MAPNIK_DIR/plugins $MAPNIK_DIR/demo/c++ $MAPNIK_DIR/src $MAPNIK_DIR/include $MAPNIK_DIR/bindings $MAPNIK_DIR/utils $MAPNIK_DIR/tests" +DIRS="$MAPNIK_DIR/plugins $MAPNIK_DIR/demo/c++ $MAPNIK_DIR/src $MAPNIK_DIR/include $MAPNIK_DIR/bindings $MAPNIK_DIR/utils $MAPNIK_DIR/tests $MAPNIK_DIR/deps/agg" + EMACS="emacs" for file in $(find $DIRS -name '*.cpp' -o -name '*.hpp') do $EMACS -batch $file -l $MAPNIK_DIR/utils/format_source_files/mapnik_format.el -f mapnik-format-function done - - diff --git a/utils/format_source_files/mapnik_format.el b/utils/format_source_files/mapnik_format.el index 5de71fc0d..a6a6f0c07 100644 --- a/utils/format_source_files/mapnik_format.el +++ b/utils/format_source_files/mapnik_format.el @@ -1,5 +1,7 @@ (defun mapnik-format-function () "Format buffer according to mapnik style (TODO)" + (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) + (c-set-style "bsd") (c-set-style "bsd") (c-set-offset 'innamespace 0) (c-set-offset 'template-args-cont 'c-lineup-template-args) diff --git a/utils/mapnik-config/build.py b/utils/mapnik-config/build.py index 08b1055c1..6b94f3c37 100644 --- a/utils/mapnik-config/build.py +++ b/utils/mapnik-config/build.py @@ -9,26 +9,27 @@ Import('env') config_env = env.Clone() -# TODO -# major/minor versions -# git rev-list --max-count=1 HEAD - config_variables = '''#!/bin/sh ## variables CONFIG_PREFIX="$( cd "$( dirname $( dirname "$0" ))" && pwd )" -CONFIG_MAPNIK_LIBNAME=%(mapnik_libname)s -CONFIG_MAPNIK_INCLUDE=${CONFIG_PREFIX}/include -CONFIG_MAPNIK_LIB=${CONFIG_PREFIX}/%(libdir_schema)s + +CONFIG_MAPNIK_VERSION_STRING='%(version_string)s' CONFIG_MAPNIK_VERSION='%(version)s' -CONFIG_MAPNIK_LDFLAGS='%(ldflags)s' -CONFIG_DEP_LIBS='%(dep_libs)s' -CONFIG_OTHER_INCLUDES='%(other_includes)s' -CONFIG_FONTS='%(fonts)s' -CONFIG_INPUT_PLUGINS='%(input_plugins)s' CONFIG_GIT_REVISION='%(git_revision)s' -CONFIG_MAPNIK_AGG_INCLUDE=${CONFIG_PREFIX}/include/mapnik/agg +CONFIG_GIT_DESCRIBE='%(git_describe)s' +CONFIG_FONTS="%(fonts)s" +CONFIG_INPUT_PLUGINS="%(input_plugins)s" +CONFIG_MAPNIK_DEFINES='%(defines)s' +CONFIG_MAPNIK_LIBNAME='%(mapnik_libname)s' +CONFIG_MAPNIK_LIBPATH="%(mapnik_libpath)s" +CONFIG_DEP_LIBS='%(dep_libs)s' +CONFIG_MAPNIK_LDFLAGS='%(ldflags)s' +CONFIG_MAPNIK_INCLUDE="${CONFIG_PREFIX}/include -I${CONFIG_PREFIX}/include/mapnik/agg" +CONFIG_DEP_INCLUDES='%(dep_includes)s' +CONFIG_CXXFLAGS='%(cxxflags)s' +CONFIG_CXX='%(cxx)s' ''' @@ -39,22 +40,19 @@ def write_config(configuration,template,config_file): os.chmod(config_file,0755) except: pass +cxxflags = ' '.join(config_env['LIBMAPNIK_CXXFLAGS']) -# todo - refine this list +defines = ' '.join(config_env['LIBMAPNIK_DEFINES']) -other_includes = ''.join([' -I%s' % i for i in config_env['CPPPATH'] if not i.startswith('#')]) +dep_includes = ''.join([' -I%s' % i for i in config_env['CPPPATH'] if not i.startswith('#')]) -other_includes += ' ' - -other_includes += ' '.join(config_env['LIBMAPNIK_CXXFLAGS']) - -other_includes += ' ' +dep_includes += ' ' if config_env['HAS_CAIRO']: - other_includes += ''.join([' -I%s' % i for i in env['CAIRO_CPPPATHS'] if not i.startswith('#')]) - + dep_includes += ''.join([' -I%s' % i for i in env['CAIRO_CPPPATHS'] if not i.startswith('#')]) ldflags = config_env['CUSTOM_LDFLAGS'] + ''.join([' -L%s' % i for i in config_env['LIBPATH'] if not i.startswith('#')]) +ldflags += config_env['LIBMAPNIK_LINKFLAGS'] dep_libs = ''.join([' -l%s' % i for i in env['LIBMAPNIK_LIBS']]) @@ -62,7 +60,9 @@ dep_libs = ''.join([' -l%s' % i for i in env['LIBMAPNIK_LIBS']]) dep_libs = dep_libs.replace('-lagg','') git_revision = 'unknown' -# present only for official releases where git metadata is stripped +git_describe = 'unknown' +# special GIT_REVISION/GIT_DESCRIBE files present only for official releases +# where the git directory metadata is stripped # more info: https://github.com/mapnik/mapnik/wiki/MapnikReleaseSteps revision_release_file = '../../GIT_REVISION' if os.path.exists(revision_release_file): @@ -73,23 +73,49 @@ else: if not stderr: git_revision = stdin.strip() +describe_release_file = '../../GIT_DESCRIBE' +if os.path.exists(describe_release_file): + git_describe = open(describe_release_file,'r').read() +else: + git_cmd = "git describe" + stdin, stderr = Popen(git_cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate() + if not stderr: + git_describe = stdin.strip() + +# for fonts and input plugins we should try +# to store the relative path, if feasible +fontspath = config_env['MAPNIK_FONTS'] +lib_root = os.path.join(config_env['INSTALL_PREFIX'], config_env['LIBDIR_SCHEMA']) +if lib_root in fontspath: + fontspath = "${CONFIG_PREFIX}/" + os.path.relpath(fontspath,config_env['INSTALL_PREFIX']) +inputpluginspath = config_env['MAPNIK_INPUT_PLUGINS'] +if lib_root in inputpluginspath: + inputpluginspath = "${CONFIG_PREFIX}/" + os.path.relpath(inputpluginspath,config_env['INSTALL_PREFIX']) + +lib_path = "${CONFIG_PREFIX}/" + config_env['LIBDIR_SCHEMA'] + configuration = { + "git_revision": git_revision, + "git_describe": git_describe, + "version_string": config_env['MAPNIK_VERSION_STRING'], + "version": config_env['MAPNIK_VERSION'], "mapnik_libname": 'mapnik', - "libdir_schema": config_env['LIBDIR_SCHEMA'], + "mapnik_libpath": lib_path, "ldflags": ldflags, "dep_libs": dep_libs, - "other_includes": other_includes, - "fonts": config_env['MAPNIK_FONTS'], - "input_plugins": config_env['MAPNIK_INPUT_PLUGINS'], - "git_revision": git_revision, - "version": config_env['MAPNIK_VERSION_STRING'], + "dep_includes": dep_includes, + "fonts": fontspath, + "input_plugins": inputpluginspath, + "defines":defines, + "cxxflags":cxxflags, + "cxx":env['CXX'] } ## if we are statically linking depedencies ## then they do not need to be reported in ldflags -if env['RUNTIME_LINK'] == 'static': - configuration['ldflags'] = '' - configuration['dep_libs'] = '' +#if env['RUNTIME_LINK'] == 'static': +# configuration['ldflags'] = '' +# configuration['dep_libs'] = '' template = 'mapnik-config.template.sh' config_file = 'mapnik-config' diff --git a/utils/mapnik-config/mapnik-config.template.sh b/utils/mapnik-config/mapnik-config.template.sh index bf6ee961e..a71fdf642 100755 --- a/utils/mapnik-config/mapnik-config.template.sh +++ b/utils/mapnik-config/mapnik-config.template.sh @@ -1,20 +1,6 @@ ## program below -CONFIG_JSON="{ - \"prefix\": \"${CONFIG_PREFIX}\", - \"mapnik_libname\": \"${CONFIG_MAPNIK_LIBNAME}\", - \"mapnik_include\": \"${CONFIG_MAPNIK_INCLUDE}\", - \"mapnik_lib\": \"${CONFIG_MAPNIK_LIB}\", - \"version\": \"${CONFIG_MAPNIK_VERSION}\", - \"ldflags\": \"${CONFIG_MAPNIK_LDFLAGS}\", - \"dep_libs\": \"${CONFIG_DEP_LIBS}\", - \"other_includes\": \"${CONFIG_OTHER_INCLUDES}\", - \"fonts\": \"${CONFIG_FONTS}\", - \"input_plugins\": \"${CONFIG_INPUT_PLUGINS}\", - \"git_revision\": \"${CONFIG_GIT_REVISION}\" -}" - usage() { cat <&2; } + if test $# -eq 0; then usage 1 fi while test $# -gt 0; do case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; esac case "$1" in - --prefix=*) - prefix=$optarg - includedir=$CONFIG_PREFIX/include - CONFIG_MAPNIK_LIB=$CONFIG_PREFIX/lib + --help) + usage 0 ;; - --prefix) - echo $CONFIG_PREFIX + -h) + usage 0 ;; -v) - echo $CONFIG_MAPNIK_VERSION + echo ${CONFIG_MAPNIK_VERSION_STRING} ;; --version) - echo $CONFIG_MAPNIK_VERSION + echo ${CONFIG_MAPNIK_VERSION_STRING} ;; - --json) - echo $CONFIG_JSON + --version-number) + echo ${CONFIG_MAPNIK_VERSION} ;; --git-revision) echo ${CONFIG_GIT_REVISION} ;; - --help) - usage 0 + --git-describe) + echo ${CONFIG_GIT_DESCRIBE} ;; --fonts) @@ -89,30 +80,57 @@ while test $# -gt 0; do echo ${CONFIG_INPUT_PLUGINS} ;; - --cflags) - echo -I${CONFIG_MAPNIK_INCLUDE} -I${CONFIG_MAPNIK_AGG_INCLUDE} ${CONFIG_OTHER_INCLUDES} + --defines) + echo ${CONFIG_MAPNIK_DEFINES} ;; - --libs) - echo -L${CONFIG_MAPNIK_LIB} -l${CONFIG_MAPNIK_LIBNAME} - ;; - - --ldflags) - echo ${CONFIG_MAPNIK_LDFLAGS} + --prefix) + echo ${CONFIG_PREFIX} ;; --lib-name) echo ${CONFIG_MAPNIK_LIBNAME} ;; + --libs) + echo -L${CONFIG_MAPNIK_LIBPATH} -l${CONFIG_MAPNIK_LIBNAME} + ;; + --dep-libs) echo ${CONFIG_DEP_LIBS} ;; + --ldflags) + echo ${CONFIG_MAPNIK_LDFLAGS} + ;; + + --includes) + echo -I${CONFIG_MAPNIK_INCLUDE} + ;; + + --dep-includes) + echo ${CONFIG_DEP_INCLUDES} + ;; + + --cxxflags) + echo ${CONFIG_CXXFLAGS} + ;; + + --cflags) + echo -I${CONFIG_MAPNIK_INCLUDE} ${CONFIG_DEP_INCLUDES} ${CONFIG_MAPNIK_DEFINES} ${CONFIG_CXXFLAGS} + ;; + + --cxx) + echo ${CONFIG_CXX} + ;; + + --all-flags) + 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} + ;; + *) - # if no matches, return 'usage 1' meaning usage + 1 (error return type) - usage 1 - exit 1 + # push to stderr any invalid options + echo "unknown option $1" 1>&2; ;; esac shift diff --git a/utils/ogrindex/build.py b/utils/ogrindex/build.py index 36fd04b2b..37b1118ce 100644 --- a/utils/ogrindex/build.py +++ b/utils/ogrindex/build.py @@ -40,7 +40,6 @@ program_env['LIBS'] = [env['PLUGINS']['ogr']['lib']] program_env['LIBS'].append('mapnik') program_env['LIBS'].append(env['ICU_LIB_NAME']) program_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND']) -program_env['LIBS'].append('boost_filesystem%s' % env['BOOST_APPEND']) program_env['LIBS'].append('boost_program_options%s' % env['BOOST_APPEND']) if env['RUNTIME_LINK'] == 'static': diff --git a/utils/ogrindex/ogrindex.cpp b/utils/ogrindex/ogrindex.cpp index 03edb8410..21906c638 100644 --- a/utils/ogrindex/ogrindex.cpp +++ b/utils/ogrindex/ogrindex.cpp @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *****************************************************************************/ -//$Id: ogrindex.cc 27 2005-03-30 21:45:40Z pavlenko $ #include @@ -28,12 +27,12 @@ #include #include -#include #include #include #include #include +#include #include #include "../shapeindex/quadtree.hpp" @@ -125,7 +124,7 @@ int main (int argc,char** argv) std::string ogrname (*itr++); - if (! boost::filesystem::exists (ogrname)) + if (! mapnik::util::exists (ogrname)) { std::clog << "error : file " << ogrname << " doesn't exists" << std::endl; continue; @@ -137,7 +136,7 @@ int main (int argc,char** argv) if (breakpoint == string::npos) breakpoint = ogrname.length(); std::string ogrlayername (ogrname.substr(0, breakpoint)); - if (boost::filesystem::exists (ogrlayername + ".ogrindex")) + if (mapnik::util::exists (ogrlayername + ".ogrindex")) { std::clog << "error : " << ogrlayername << ".ogrindex file already exists for " << ogrname << std::endl; continue; diff --git a/utils/pgsql2sqlite/build.py b/utils/pgsql2sqlite/build.py index 0be6d4944..ac0dea107 100644 --- a/utils/pgsql2sqlite/build.py +++ b/utils/pgsql2sqlite/build.py @@ -36,10 +36,11 @@ source = Split( ) program_env['CXXFLAGS'] = copy(env['LIBMAPNIK_CXXFLAGS']) +program_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES']) if env['HAS_CAIRO']: program_env.PrependUnique(CPPPATH=env['CAIRO_CPPPATHS']) - program_env.Append(CXXFLAGS = '-DHAVE_CAIRO') + program_env.Append(CPPDEFINES = '-DHAVE_CAIRO') program_env.PrependUnique(CPPPATH=['#plugins/input/postgis']) @@ -58,7 +59,12 @@ if env['SQLITE_LINKFLAGS']: linkflags.append(env['SQLITE_LINKFLAGS']) if env['RUNTIME_LINK'] == 'static': - libraries.extend(['ldap','pam','ssl','crypto','krb5']) + if env['PLATFORM'] == 'Darwin': + libraries.extend(['ldap', 'pam', 'ssl', 'crypto', 'krb5']) + else: + # TODO - parse back into libraries variable + program_env.ParseConfig('pg_config --libs') + libraries.append('dl') pgsql2sqlite = program_env.Program('pgsql2sqlite', source, LIBS=libraries, LINKFLAGS=linkflags) Depends(pgsql2sqlite, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME'])) diff --git a/utils/pgsql2sqlite/pgsql2sqlite.hpp b/utils/pgsql2sqlite/pgsql2sqlite.hpp index b799bb2eb..8962d0f9f 100644 --- a/utils/pgsql2sqlite/pgsql2sqlite.hpp +++ b/utils/pgsql2sqlite/pgsql2sqlite.hpp @@ -212,7 +212,10 @@ void pgsql2sqlite(Connection conn, if ( rs->next()) { - mapnik::util::string2int(rs->getValue("srid"),srid); + if (!mapnik::util::string2int(rs->getValue("srid"),srid)) + { + std::clog << "could not convert srid to integer\n"; + } geom_col = rs->getValue("f_geometry_column"); geom_type = rs->getValue("type"); } diff --git a/utils/shapeindex/build.py b/utils/shapeindex/build.py index 876631b92..4d92bd374 100644 --- a/utils/shapeindex/build.py +++ b/utils/shapeindex/build.py @@ -21,6 +21,7 @@ import os import glob +from copy import copy Import ('env') @@ -37,9 +38,12 @@ source += program_env.Object('box2d-static', '#src/box2d.cpp') headers = ['#plugins/input/shape'] + env['CPPPATH'] boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND'] -boost_filesystem = 'boost_filesystem%s' % env['BOOST_APPEND'] boost_system = 'boost_system%s' % env['BOOST_APPEND'] -libraries = [boost_program_options, boost_filesystem, boost_system] +libraries = ['mapnik', boost_program_options, boost_system] +if env['RUNTIME_LINK'] == 'static': + libraries.extend(copy(env['LIBMAPNIK_LIBS'])) + if env['PLATFORM'] == 'Linux': + libraries.append('dl') if env.get('BOOST_LIB_VERSION_FROM_HEADER'): boost_version_from_header = int(env['BOOST_LIB_VERSION_FROM_HEADER'].split('_')[1]) diff --git a/utils/shapeindex/quadtree.hpp b/utils/shapeindex/quadtree.hpp index 6b13f0930..57aee0f16 100644 --- a/utils/shapeindex/quadtree.hpp +++ b/utils/shapeindex/quadtree.hpp @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *****************************************************************************/ -//$Id: quadtree.hh 17 2005-03-08 23:58:43Z pavlenko $ #ifndef QUADTREE_HPP #define QUADTREE_HPP diff --git a/utils/shapeindex/shapeindex.cpp b/utils/shapeindex/shapeindex.cpp index a5ba5ca81..391a707ae 100644 --- a/utils/shapeindex/shapeindex.cpp +++ b/utils/shapeindex/shapeindex.cpp @@ -19,16 +19,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *****************************************************************************/ -//$Id: shapeindex.cc 27 2005-03-30 21:45:40Z pavlenko $ #include #include #include - +#include #include #include -#include #include #include "quadtree.hpp" #include "shapefile.hpp" @@ -123,7 +121,7 @@ int main (int argc,char** argv) boost::algorithm::ireplace_last(shapename,".shp",""); std::string shapename_full (shapename+".shp"); - if (! boost::filesystem::exists (shapename_full)) + if (! mapnik::util::exists (shapename_full)) { clog << "error : file " << shapename_full << " does not exist" << endl; continue; diff --git a/utils/svg2png/build.py b/utils/svg2png/build.py index 7712cec59..95195141a 100644 --- a/utils/svg2png/build.py +++ b/utils/svg2png/build.py @@ -34,14 +34,17 @@ source = Split( ) program_env['CXXFLAGS'] = copy(env['LIBMAPNIK_CXXFLAGS']) +program_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES']) if env['HAS_CAIRO']: program_env.PrependUnique(CPPPATH=env['CAIRO_CPPPATHS']) - program_env.Append(CXXFLAGS = '-DHAVE_CAIRO') + program_env.Append(CPPDEFINES = '-DHAVE_CAIRO') -libraries = copy(env['LIBMAPNIK_LIBS']) boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND'] -libraries.extend([boost_program_options,'mapnik']) +libraries = ['mapnik',boost_program_options] +libraries.extend(copy(env['LIBMAPNIK_LIBS'])) +if env['RUNTIME_LINK'] == 'static' and env['PLATFORM'] == 'Linux': + libraries.append('dl') svg2png = program_env.Program('svg2png', source, LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS']) diff --git a/utils/svg2png/svg2png.cpp b/utils/svg2png/svg2png.cpp index 40cc8fa25..947ef95c4 100644 --- a/utils/svg2png/svg2png.cpp +++ b/utils/svg2png/svg2png.cpp @@ -36,7 +36,6 @@ #include #include -#include #include #include "agg_rasterizer_scanline_aa.h" @@ -174,7 +173,7 @@ int main (int argc,char** argv) agg::pod_bvector, renderer_solid, agg::pixfmt_rgba32_pre > svg_renderer_this(svg_path, - (*marker.get_vector_data())->attributes()); + (*marker.get_vector_data())->attributes()); svg_renderer_this.render(ras_ptr, sl, renb, mtx, opacity, bbox); diff --git a/workspace/All.files b/workspace/All.files deleted file mode 100644 index 8ea8c6349..000000000 --- a/workspace/All.files +++ /dev/null @@ -1,1018 +0,0 @@ -HEADERS += \ - ../bindings/python/mapnik_enumeration.hpp \ - ../bindings/python/mapnik_svg.hpp \ - ../bindings/python/mapnik_threads.hpp \ - ../bindings/python/mapnik_value_converter.hpp \ - ../bindings/python/python_grid_utils.hpp \ - ../bindings/python/python_optional.hpp \ - ../boost/geometry/extensions/index/rtree/helpers.hpp \ - ../boost/geometry/extensions/index/rtree/rtree.hpp \ - ../boost/geometry/extensions/index/rtree/rtree_leaf.hpp \ - ../boost/geometry/extensions/index/rtree/rtree_node.hpp \ - ../boost/gil/extension/toolbox/hsl.hpp \ - ../boost/gil/extension/toolbox/hsv.hpp \ - ../deps/agg/include/agg_alpha_mask_u8.h \ - ../deps/agg/include/agg_arc.h \ - ../deps/agg/include/agg_array.h \ - ../deps/agg/include/agg_arrowhead.h \ - ../deps/agg/include/agg_basics.h \ - ../deps/agg/include/agg_bezier_arc.h \ - ../deps/agg/include/agg_bitset_iterator.h \ - ../deps/agg/include/agg_blur.h \ - ../deps/agg/include/agg_bounding_rect.h \ - ../deps/agg/include/agg_bspline.h \ - ../deps/agg/include/agg_clip_liang_barsky.h \ - ../deps/agg/include/agg_color_gray.h \ - ../deps/agg/include/agg_color_rgba.h \ - ../deps/agg/include/agg_config.h \ - ../deps/agg/include/agg_conv_adaptor_vcgen.h \ - ../deps/agg/include/agg_conv_adaptor_vpgen.h \ - ../deps/agg/include/agg_conv_bspline.h \ - ../deps/agg/include/agg_conv_clip_polygon.h \ - ../deps/agg/include/agg_conv_clip_polyline.h \ - ../deps/agg/include/agg_conv_close_polygon.h \ - ../deps/agg/include/agg_conv_concat.h \ - ../deps/agg/include/agg_conv_contour.h \ - ../deps/agg/include/agg_conv_curve.h \ - ../deps/agg/include/agg_conv_dash.h \ - ../deps/agg/include/agg_conv_gpc.h \ - ../deps/agg/include/agg_conv_marker.h \ - ../deps/agg/include/agg_conv_marker_adaptor.h \ - ../deps/agg/include/agg_conv_segmentator.h \ - ../deps/agg/include/agg_conv_shorten_path.h \ - ../deps/agg/include/agg_conv_smooth_poly1.h \ - ../deps/agg/include/agg_conv_stroke.h \ - ../deps/agg/include/agg_conv_transform.h \ - ../deps/agg/include/agg_conv_unclose_polygon.h \ - ../deps/agg/include/agg_curves.h \ - ../deps/agg/include/agg_dda_line.h \ - ../deps/agg/include/agg_ellipse.h \ - ../deps/agg/include/agg_ellipse_bresenham.h \ - ../deps/agg/include/agg_embedded_raster_fonts.h \ - ../deps/agg/include/agg_font_cache_manager.h \ - ../deps/agg/include/agg_gamma_functions.h \ - ../deps/agg/include/agg_gamma_lut.h \ - ../deps/agg/include/agg_glyph_raster_bin.h \ - ../deps/agg/include/agg_gradient_lut.h \ - ../deps/agg/include/agg_gsv_text.h \ - ../deps/agg/include/agg_image_accessors.h \ - ../deps/agg/include/agg_image_filters.h \ - ../deps/agg/include/agg_line_aa_basics.h \ - ../deps/agg/include/agg_math.h \ - ../deps/agg/include/agg_math_stroke.h \ - ../deps/agg/include/agg_path_length.h \ - ../deps/agg/include/agg_path_storage.h \ - ../deps/agg/include/agg_path_storage_integer.h \ - ../deps/agg/include/agg_pattern_filters_rgba.h \ - ../deps/agg/include/agg_pixfmt_amask_adaptor.h \ - ../deps/agg/include/agg_pixfmt_gray.h \ - ../deps/agg/include/agg_pixfmt_rgb.h \ - ../deps/agg/include/agg_pixfmt_rgb_packed.h \ - ../deps/agg/include/agg_pixfmt_rgba.h \ - ../deps/agg/include/agg_pixfmt_transposer.h \ - ../deps/agg/include/agg_rasterizer_cells_aa.h \ - ../deps/agg/include/agg_rasterizer_compound_aa.h \ - ../deps/agg/include/agg_rasterizer_outline.h \ - ../deps/agg/include/agg_rasterizer_outline_aa.h \ - ../deps/agg/include/agg_rasterizer_scanline_aa.h \ - ../deps/agg/include/agg_rasterizer_sl_clip.h \ - ../deps/agg/include/agg_renderer_base.h \ - ../deps/agg/include/agg_renderer_markers.h \ - ../deps/agg/include/agg_renderer_mclip.h \ - ../deps/agg/include/agg_renderer_outline_aa.h \ - ../deps/agg/include/agg_renderer_outline_image.h \ - ../deps/agg/include/agg_renderer_primitives.h \ - ../deps/agg/include/agg_renderer_raster_text.h \ - ../deps/agg/include/agg_renderer_scanline.h \ - ../deps/agg/include/agg_rendering_buffer.h \ - ../deps/agg/include/agg_rendering_buffer_dynarow.h \ - ../deps/agg/include/agg_rounded_rect.h \ - ../deps/agg/include/agg_scanline_bin.h \ - ../deps/agg/include/agg_scanline_boolean_algebra.h \ - ../deps/agg/include/agg_scanline_p.h \ - ../deps/agg/include/agg_scanline_storage_aa.h \ - ../deps/agg/include/agg_scanline_storage_bin.h \ - ../deps/agg/include/agg_scanline_u.h \ - ../deps/agg/include/agg_shorten_path.h \ - ../deps/agg/include/agg_simul_eq.h \ - ../deps/agg/include/agg_span_allocator.h \ - ../deps/agg/include/agg_span_converter.h \ - ../deps/agg/include/agg_span_gouraud.h \ - ../deps/agg/include/agg_span_gouraud_gray.h \ - ../deps/agg/include/agg_span_gouraud_rgba.h \ - ../deps/agg/include/agg_span_gradient.h \ - ../deps/agg/include/agg_span_gradient_alpha.h \ - ../deps/agg/include/agg_span_image_filter.h \ - ../deps/agg/include/agg_span_image_filter_gray.h \ - ../deps/agg/include/agg_span_image_filter_rgb.h \ - ../deps/agg/include/agg_span_image_filter_rgba.h \ - ../deps/agg/include/agg_span_interpolator_adaptor.h \ - ../deps/agg/include/agg_span_interpolator_linear.h \ - ../deps/agg/include/agg_span_interpolator_persp.h \ - ../deps/agg/include/agg_span_interpolator_trans.h \ - ../deps/agg/include/agg_span_pattern_gray.h \ - ../deps/agg/include/agg_span_pattern_rgb.h \ - ../deps/agg/include/agg_span_pattern_rgba.h \ - ../deps/agg/include/agg_span_solid.h \ - ../deps/agg/include/agg_span_subdiv_adaptor.h \ - ../deps/agg/include/agg_trans_affine.h \ - ../deps/agg/include/agg_trans_bilinear.h \ - ../deps/agg/include/agg_trans_double_path.h \ - ../deps/agg/include/agg_trans_lens.h \ - ../deps/agg/include/agg_trans_perspective.h \ - ../deps/agg/include/agg_trans_single_path.h \ - ../deps/agg/include/agg_trans_viewport.h \ - ../deps/agg/include/agg_trans_warp_magnifier.h \ - ../deps/agg/include/agg_vcgen_bspline.h \ - ../deps/agg/include/agg_vcgen_contour.h \ - ../deps/agg/include/agg_vcgen_dash.h \ - ../deps/agg/include/agg_vcgen_markers_term.h \ - ../deps/agg/include/agg_vcgen_smooth_poly1.h \ - ../deps/agg/include/agg_vcgen_stroke.h \ - ../deps/agg/include/agg_vcgen_vertex_sequence.h \ - ../deps/agg/include/agg_vertex_sequence.h \ - ../deps/agg/include/agg_vpgen_clip_polygon.h \ - ../deps/agg/include/agg_vpgen_clip_polyline.h \ - ../deps/agg/include/agg_vpgen_segmentator.h \ - ../deps/mapnik/sparsehash/internal/densehashtable.h \ - ../deps/mapnik/sparsehash/internal/hashtable-common.h \ - ../deps/mapnik/sparsehash/internal/libc_allocator_with_realloc.h \ - ../deps/mapnik/sparsehash/internal/sparseconfig.h \ - ../deps/mapnik/sparsehash/template_util.h \ - ../deps/mapnik/sparsehash/type_traits.h \ - ../include/mapnik/agg_helpers.hpp \ - ../include/mapnik/agg_helpers.hpp \ - ../include/mapnik/agg_pattern_source.hpp \ - ../include/mapnik/agg_pattern_source.hpp \ - ../include/mapnik/agg_rasterizer.hpp \ - ../include/mapnik/agg_rasterizer.hpp \ - ../include/mapnik/agg_renderer.hpp \ - ../include/mapnik/agg_renderer.hpp \ - ../include/mapnik/attribute.hpp \ - ../include/mapnik/attribute.hpp \ - ../include/mapnik/attribute_collector.hpp \ - ../include/mapnik/attribute_collector.hpp \ - ../include/mapnik/attribute_descriptor.hpp \ - ../include/mapnik/attribute_descriptor.hpp \ - ../include/mapnik/boolean.hpp \ - ../include/mapnik/boolean.hpp \ - ../include/mapnik/box2d.hpp \ - ../include/mapnik/box2d.hpp \ - ../include/mapnik/building_symbolizer.hpp \ - ../include/mapnik/building_symbolizer.hpp \ - ../include/mapnik/cairo_context.hpp \ - ../include/mapnik/cairo_context.hpp \ - ../include/mapnik/cairo_renderer.hpp \ - ../include/mapnik/cairo_renderer.hpp \ - ../include/mapnik/char_info.hpp \ - ../include/mapnik/char_info.hpp \ - ../include/mapnik/color.hpp \ - ../include/mapnik/color.hpp \ - ../include/mapnik/color_factory.hpp \ - ../include/mapnik/color_factory.hpp \ - ../include/mapnik/config.hpp \ - ../include/mapnik/config.hpp \ - ../include/mapnik/config_error.hpp \ - ../include/mapnik/config_error.hpp \ - ../include/mapnik/coord.hpp \ - ../include/mapnik/coord.hpp \ - ../include/mapnik/coord_array.hpp \ - ../include/mapnik/coord_array.hpp \ - ../include/mapnik/css_color_grammar.hpp \ - ../include/mapnik/css_color_grammar.hpp \ - ../include/mapnik/css_color_grammar_def.hpp \ - ../include/mapnik/css_color_grammar_def.hpp \ - ../include/mapnik/ctrans.hpp \ - ../include/mapnik/ctrans.hpp \ - ../include/mapnik/datasource.hpp \ - ../include/mapnik/datasource.hpp \ - ../include/mapnik/datasource_cache.hpp \ - ../include/mapnik/datasource_cache.hpp \ - ../include/mapnik/debug.hpp \ - ../include/mapnik/debug.hpp \ - ../include/mapnik/debug_symbolizer.hpp \ - ../include/mapnik/debug_symbolizer.hpp \ - ../include/mapnik/distance.hpp \ - ../include/mapnik/distance.hpp \ - ../include/mapnik/ellipsoid.hpp \ - ../include/mapnik/ellipsoid.hpp \ - ../include/mapnik/enumeration.hpp \ - ../include/mapnik/enumeration.hpp \ - ../include/mapnik/expression.hpp \ - ../include/mapnik/expression.hpp \ - ../include/mapnik/expression_evaluator.hpp \ - ../include/mapnik/expression_evaluator.hpp \ - ../include/mapnik/expression_grammar.hpp \ - ../include/mapnik/expression_grammar.hpp \ - ../include/mapnik/expression_node.hpp \ - ../include/mapnik/expression_node.hpp \ - ../include/mapnik/expression_node_types.hpp \ - ../include/mapnik/expression_node_types.hpp \ - ../include/mapnik/expression_string.hpp \ - ../include/mapnik/expression_string.hpp \ - ../include/mapnik/factory.hpp \ - ../include/mapnik/factory.hpp \ - ../include/mapnik/fastmath.hpp \ - ../include/mapnik/fastmath.hpp \ - ../include/mapnik/feature.hpp \ - ../include/mapnik/feature.hpp \ - ../include/mapnik/feature_factory.hpp \ - ../include/mapnik/feature_factory.hpp \ - ../include/mapnik/feature_kv_iterator.hpp \ - ../include/mapnik/feature_kv_iterator.hpp \ - ../include/mapnik/feature_layer_desc.hpp \ - ../include/mapnik/feature_layer_desc.hpp \ - ../include/mapnik/feature_style_processor.hpp \ - ../include/mapnik/feature_style_processor.hpp \ - ../include/mapnik/feature_style_processor_impl.hpp \ - ../include/mapnik/feature_style_processor_impl.hpp \ - ../include/mapnik/feature_type_style.hpp \ - ../include/mapnik/feature_type_style.hpp \ - ../include/mapnik/filter_factory.hpp \ - ../include/mapnik/filter_factory.hpp \ - ../include/mapnik/filter_featureset.hpp \ - ../include/mapnik/filter_featureset.hpp \ - ../include/mapnik/font_engine_freetype.hpp \ - ../include/mapnik/font_engine_freetype.hpp \ - ../include/mapnik/font_set.hpp \ - ../include/mapnik/font_set.hpp \ - ../include/mapnik/formatting/base.hpp \ - ../include/mapnik/formatting/base.hpp \ - ../include/mapnik/formatting/expression_format.hpp \ - ../include/mapnik/formatting/expression_format.hpp \ - ../include/mapnik/formatting/format.hpp \ - ../include/mapnik/formatting/format.hpp \ - ../include/mapnik/formatting/list.hpp \ - ../include/mapnik/formatting/list.hpp \ - ../include/mapnik/formatting/registry.hpp \ - ../include/mapnik/formatting/registry.hpp \ - ../include/mapnik/formatting/text.hpp \ - ../include/mapnik/formatting/text.hpp \ - ../include/mapnik/gamma_method.hpp \ - ../include/mapnik/gamma_method.hpp \ - ../include/mapnik/geom_util.hpp \ - ../include/mapnik/geom_util.hpp \ - ../include/mapnik/geometry.hpp \ - ../include/mapnik/geometry.hpp \ - ../include/mapnik/global.hpp \ - ../include/mapnik/global.hpp \ - ../include/mapnik/gradient.hpp \ - ../include/mapnik/gradient.hpp \ - ../include/mapnik/graphics.hpp \ - ../include/mapnik/graphics.hpp \ - ../include/mapnik/grid/grid.hpp \ - ../include/mapnik/grid/grid.hpp \ - ../include/mapnik/grid/grid_marker_helpers.hpp \ - ../include/mapnik/grid/grid_marker_helpers.hpp \ - ../include/mapnik/grid/grid_pixel.hpp \ - ../include/mapnik/grid/grid_pixel.hpp \ - ../include/mapnik/grid/grid_pixfmt.hpp \ - ../include/mapnik/grid/grid_pixfmt.hpp \ - ../include/mapnik/grid/grid_rasterizer.hpp \ - ../include/mapnik/grid/grid_rasterizer.hpp \ - ../include/mapnik/grid/grid_renderer.hpp \ - ../include/mapnik/grid/grid_renderer.hpp \ - ../include/mapnik/grid/grid_renderer_base.hpp \ - ../include/mapnik/grid/grid_renderer_base.hpp \ - ../include/mapnik/grid/grid_rendering_buffer.hpp \ - ../include/mapnik/grid/grid_rendering_buffer.hpp \ - ../include/mapnik/grid/grid_util.hpp \ - ../include/mapnik/grid/grid_util.hpp \ - ../include/mapnik/grid/grid_view.hpp \ - ../include/mapnik/grid/grid_view.hpp \ - ../include/mapnik/hextree.hpp \ - ../include/mapnik/hextree.hpp \ - ../include/mapnik/hit_test_filter.hpp \ - ../include/mapnik/hit_test_filter.hpp \ - ../include/mapnik/image_compositing.hpp \ - ../include/mapnik/image_compositing.hpp \ - ../include/mapnik/image_data.hpp \ - ../include/mapnik/image_data.hpp \ - ../include/mapnik/image_filter.hpp \ - ../include/mapnik/image_filter.hpp \ - ../include/mapnik/image_filter_grammar.hpp \ - ../include/mapnik/image_filter_grammar.hpp \ - ../include/mapnik/image_filter_types.hpp \ - ../include/mapnik/image_filter_types.hpp \ - ../include/mapnik/image_reader.hpp \ - ../include/mapnik/image_reader.hpp \ - ../include/mapnik/image_scaling.hpp \ - ../include/mapnik/image_scaling.hpp \ - ../include/mapnik/image_util.hpp \ - ../include/mapnik/image_util.hpp \ - ../include/mapnik/image_view.hpp \ - ../include/mapnik/image_view.hpp \ - ../include/mapnik/internal/dump_xml.hpp \ - ../include/mapnik/internal/dump_xml.hpp \ - ../include/mapnik/jpeg_io.hpp \ - ../include/mapnik/jpeg_io.hpp \ - ../include/mapnik/json/feature_collection_grammar.hpp \ - ../include/mapnik/json/feature_collection_grammar.hpp \ - ../include/mapnik/json/feature_collection_parser.hpp \ - ../include/mapnik/json/feature_collection_parser.hpp \ - ../include/mapnik/json/feature_generator_grammar.hpp \ - ../include/mapnik/json/feature_generator_grammar.hpp \ - ../include/mapnik/json/feature_grammar.hpp \ - ../include/mapnik/json/feature_grammar.hpp \ - ../include/mapnik/json/geojson_generator.hpp \ - ../include/mapnik/json/geojson_generator.hpp \ - ../include/mapnik/json/geometry_generator_grammar.hpp \ - ../include/mapnik/json/geometry_generator_grammar.hpp \ - ../include/mapnik/json/geometry_grammar.hpp \ - ../include/mapnik/json/geometry_grammar.hpp \ - ../include/mapnik/json/geometry_parser.hpp \ - ../include/mapnik/json/geometry_parser.hpp \ - ../include/mapnik/label_collision_detector.hpp \ - ../include/mapnik/label_collision_detector.hpp \ - ../include/mapnik/layer.hpp \ - ../include/mapnik/layer.hpp \ - ../include/mapnik/line_pattern_symbolizer.hpp \ - ../include/mapnik/line_pattern_symbolizer.hpp \ - ../include/mapnik/line_symbolizer.hpp \ - ../include/mapnik/line_symbolizer.hpp \ - ../include/mapnik/load_map.hpp \ - ../include/mapnik/load_map.hpp \ - ../include/mapnik/map.hpp \ - ../include/mapnik/map.hpp \ - ../include/mapnik/mapped_memory_cache.hpp \ - ../include/mapnik/mapped_memory_cache.hpp \ - ../include/mapnik/marker.hpp \ - ../include/mapnik/marker.hpp \ - ../include/mapnik/marker_cache.hpp \ - ../include/mapnik/marker_cache.hpp \ - ../include/mapnik/marker_helpers.hpp \ - ../include/mapnik/marker_helpers.hpp \ - ../include/mapnik/markers_placement.hpp \ - ../include/mapnik/markers_placement.hpp \ - ../include/mapnik/markers_symbolizer.hpp \ - ../include/mapnik/markers_symbolizer.hpp \ - ../include/mapnik/memory.hpp \ - ../include/mapnik/memory.hpp \ - ../include/mapnik/memory_datasource.hpp \ - ../include/mapnik/memory_datasource.hpp \ - ../include/mapnik/memory_featureset.hpp \ - ../include/mapnik/memory_featureset.hpp \ - ../include/mapnik/miniz_png.hpp \ - ../include/mapnik/miniz_png.hpp \ - ../include/mapnik/noncopyable.hpp \ - ../include/mapnik/noncopyable.hpp \ - ../include/mapnik/octree.hpp \ - ../include/mapnik/octree.hpp \ - ../include/mapnik/offset_converter.hpp \ - ../include/mapnik/offset_converter.hpp \ - ../include/mapnik/palette.hpp \ - ../include/mapnik/palette.hpp \ - ../include/mapnik/params.hpp \ - ../include/mapnik/params.hpp \ - ../include/mapnik/params_impl.hpp \ - ../include/mapnik/params_impl.hpp \ - ../include/mapnik/parse_path.hpp \ - ../include/mapnik/parse_path.hpp \ - ../include/mapnik/parse_transform.hpp \ - ../include/mapnik/parse_transform.hpp \ - ../include/mapnik/path_expression.hpp \ - ../include/mapnik/path_expression.hpp \ - ../include/mapnik/path_expression_grammar.hpp \ - ../include/mapnik/path_expression_grammar.hpp \ - ../include/mapnik/pixel_position.hpp \ - ../include/mapnik/pixel_position.hpp \ - ../include/mapnik/placement_finder.hpp \ - ../include/mapnik/placement_finder.hpp \ - ../include/mapnik/plugin.hpp \ - ../include/mapnik/plugin.hpp \ - ../include/mapnik/png_io.hpp \ - ../include/mapnik/png_io.hpp \ - ../include/mapnik/point_symbolizer.hpp \ - ../include/mapnik/point_symbolizer.hpp \ - ../include/mapnik/polygon_pattern_symbolizer.hpp \ - ../include/mapnik/polygon_pattern_symbolizer.hpp \ - ../include/mapnik/polygon_symbolizer.hpp \ - ../include/mapnik/polygon_symbolizer.hpp \ - ../include/mapnik/pool.hpp \ - ../include/mapnik/pool.hpp \ - ../include/mapnik/processed_text.hpp \ - ../include/mapnik/processed_text.hpp \ - ../include/mapnik/proj_transform.hpp \ - ../include/mapnik/proj_transform.hpp \ - ../include/mapnik/projection.hpp \ - ../include/mapnik/projection.hpp \ - ../include/mapnik/ptree_helpers.hpp \ - ../include/mapnik/ptree_helpers.hpp \ - ../include/mapnik/quad_tree.hpp \ - ../include/mapnik/quad_tree.hpp \ - ../include/mapnik/query.hpp \ - ../include/mapnik/query.hpp \ - ../include/mapnik/raster.hpp \ - ../include/mapnik/raster.hpp \ - ../include/mapnik/raster_colorizer.hpp \ - ../include/mapnik/raster_colorizer.hpp \ - ../include/mapnik/raster_symbolizer.hpp \ - ../include/mapnik/raster_symbolizer.hpp \ - ../include/mapnik/rule.hpp \ - ../include/mapnik/rule.hpp \ - ../include/mapnik/save_map.hpp \ - ../include/mapnik/save_map.hpp \ - ../include/mapnik/scale_denominator.hpp \ - ../include/mapnik/scale_denominator.hpp \ - ../include/mapnik/segment.hpp \ - ../include/mapnik/segment.hpp \ - ../include/mapnik/shield_symbolizer.hpp \ - ../include/mapnik/shield_symbolizer.hpp \ - ../include/mapnik/simplify.hpp \ - ../include/mapnik/simplify.hpp \ - ../include/mapnik/simplify_converter.hpp \ - ../include/mapnik/simplify_converter.hpp \ - ../include/mapnik/span_image_filter.hpp \ - ../include/mapnik/span_image_filter.hpp \ - ../include/mapnik/sql_utils.hpp \ - ../include/mapnik/sql_utils.hpp \ - ../include/mapnik/stroke.hpp \ - ../include/mapnik/stroke.hpp \ - ../include/mapnik/svg/output/svg_generator.hpp \ - ../include/mapnik/svg/output/svg_generator.hpp \ - ../include/mapnik/svg/output/svg_output_attributes.hpp \ - ../include/mapnik/svg/output/svg_output_attributes.hpp \ - ../include/mapnik/svg/output/svg_output_grammars.hpp \ - ../include/mapnik/svg/output/svg_output_grammars.hpp \ - ../include/mapnik/svg/output/svg_path_iterator.hpp \ - ../include/mapnik/svg/output/svg_path_iterator.hpp \ - ../include/mapnik/svg/output/svg_renderer.hpp \ - ../include/mapnik/svg/output/svg_renderer.hpp \ - ../include/mapnik/svg/svg_converter.hpp \ - ../include/mapnik/svg/svg_converter.hpp \ - ../include/mapnik/svg/svg_parser.hpp \ - ../include/mapnik/svg/svg_parser.hpp \ - ../include/mapnik/svg/svg_path_adapter.hpp \ - ../include/mapnik/svg/svg_path_adapter.hpp \ - ../include/mapnik/svg/svg_path_attributes.hpp \ - ../include/mapnik/svg/svg_path_attributes.hpp \ - ../include/mapnik/svg/svg_path_commands.hpp \ - ../include/mapnik/svg/svg_path_commands.hpp \ - ../include/mapnik/svg/svg_path_grammar.hpp \ - ../include/mapnik/svg/svg_path_grammar.hpp \ - ../include/mapnik/svg/svg_path_parser.hpp \ - ../include/mapnik/svg/svg_path_parser.hpp \ - ../include/mapnik/svg/svg_points_grammar.hpp \ - ../include/mapnik/svg/svg_points_grammar.hpp \ - ../include/mapnik/svg/svg_renderer_agg.hpp \ - ../include/mapnik/svg/svg_renderer_agg.hpp \ - ../include/mapnik/svg/svg_storage.hpp \ - ../include/mapnik/svg/svg_storage.hpp \ - ../include/mapnik/svg/svg_transform_grammar.hpp \ - ../include/mapnik/svg/svg_transform_grammar.hpp \ - ../include/mapnik/symbolizer.hpp \ - ../include/mapnik/symbolizer.hpp \ - ../include/mapnik/symbolizer_hash.hpp \ - ../include/mapnik/symbolizer_hash.hpp \ - ../include/mapnik/symbolizer_helpers.hpp \ - ../include/mapnik/symbolizer_helpers.hpp \ - ../include/mapnik/text_path.hpp \ - ../include/mapnik/text_path.hpp \ - ../include/mapnik/text_placements/base.hpp \ - ../include/mapnik/text_placements/base.hpp \ - ../include/mapnik/text_placements/dummy.hpp \ - ../include/mapnik/text_placements/dummy.hpp \ - ../include/mapnik/text_placements/list.hpp \ - ../include/mapnik/text_placements/list.hpp \ - ../include/mapnik/text_placements/registry.hpp \ - ../include/mapnik/text_placements/registry.hpp \ - ../include/mapnik/text_placements/simple.hpp \ - ../include/mapnik/text_placements/simple.hpp \ - ../include/mapnik/text_properties.hpp \ - ../include/mapnik/text_properties.hpp \ - ../include/mapnik/text_symbolizer.hpp \ - ../include/mapnik/text_symbolizer.hpp \ - ../include/mapnik/tiff_io.hpp \ - ../include/mapnik/tiff_io.hpp \ - ../include/mapnik/timer.hpp \ - ../include/mapnik/timer.hpp \ - ../include/mapnik/transform_expression.hpp \ - ../include/mapnik/transform_expression.hpp \ - ../include/mapnik/transform_expression_grammar.hpp \ - ../include/mapnik/transform_expression_grammar.hpp \ - ../include/mapnik/transform_processor.hpp \ - ../include/mapnik/transform_processor.hpp \ - ../include/mapnik/unicode.hpp \ - ../include/mapnik/unicode.hpp \ - ../include/mapnik/util/container_adapter.hpp \ - ../include/mapnik/util/container_adapter.hpp \ - ../include/mapnik/util/conversions.hpp \ - ../include/mapnik/util/conversions.hpp \ - ../include/mapnik/util/dasharray_parser.hpp \ - ../include/mapnik/util/dasharray_parser.hpp \ - ../include/mapnik/util/deepcopy.hpp \ - ../include/mapnik/util/deepcopy.hpp \ - ../include/mapnik/util/geometry_svg_generator.hpp \ - ../include/mapnik/util/geometry_svg_generator.hpp \ - ../include/mapnik/util/geometry_to_ds_type.hpp \ - ../include/mapnik/util/geometry_to_ds_type.hpp \ - ../include/mapnik/util/geometry_to_svg.hpp \ - ../include/mapnik/util/geometry_to_svg.hpp \ - ../include/mapnik/util/geometry_to_wkb.hpp \ - ../include/mapnik/util/geometry_to_wkb.hpp \ - ../include/mapnik/util/geometry_to_wkt.hpp \ - ../include/mapnik/util/geometry_to_wkt.hpp \ - ../include/mapnik/util/geometry_wkt_generator.hpp \ - ../include/mapnik/util/geometry_wkt_generator.hpp \ - ../include/mapnik/util/path_iterator.hpp \ - ../include/mapnik/util/path_iterator.hpp \ - ../include/mapnik/util/trim.hpp \ - ../include/mapnik/util/trim.hpp \ - ../include/mapnik/utils.hpp \ - ../include/mapnik/utils.hpp \ - ../include/mapnik/value.hpp \ - ../include/mapnik/value.hpp \ - ../include/mapnik/value_error.hpp \ - ../include/mapnik/value_error.hpp \ - ../include/mapnik/value_types.hpp \ - ../include/mapnik/value_types.hpp \ - ../include/mapnik/version.hpp \ - ../include/mapnik/version.hpp \ - ../include/mapnik/vertex.hpp \ - ../include/mapnik/vertex.hpp \ - ../include/mapnik/vertex_converters.hpp \ - ../include/mapnik/vertex_converters.hpp \ - ../include/mapnik/vertex_vector.hpp \ - ../include/mapnik/vertex_vector.hpp \ - ../include/mapnik/warp.hpp \ - ../include/mapnik/warp.hpp \ - ../include/mapnik/well_known_srs.hpp \ - ../include/mapnik/well_known_srs.hpp \ - ../include/mapnik/wkb.hpp \ - ../include/mapnik/wkb.hpp \ - ../include/mapnik/wkt/wkt_factory.hpp \ - ../include/mapnik/wkt/wkt_factory.hpp \ - ../include/mapnik/wkt/wkt_grammar.hpp \ - ../include/mapnik/wkt/wkt_grammar.hpp \ - ../include/mapnik/xml_attribute_cast.hpp \ - ../include/mapnik/xml_attribute_cast.hpp \ - ../include/mapnik/xml_loader.hpp \ - ../include/mapnik/xml_loader.hpp \ - ../include/mapnik/xml_node.hpp \ - ../include/mapnik/xml_node.hpp \ - ../include/mapnik/xml_tree.hpp \ - ../include/mapnik/xml_tree.hpp \ - ../plugins/input/csv/csv_datasource.hpp \ - ../plugins/input/csv/csv_utils.hpp \ - ../plugins/input/gdal/gdal_datasource.hpp \ - ../plugins/input/gdal/gdal_featureset.hpp \ - ../plugins/input/geojson/geojson_datasource.hpp \ - ../plugins/input/geojson/geojson_featureset.hpp \ - ../plugins/input/geos/geos_datasource.hpp \ - ../plugins/input/geos/geos_feature_ptr.hpp \ - ../plugins/input/geos/geos_featureset.hpp \ - ../plugins/input/kismet/kismet_datasource.hpp \ - ../plugins/input/kismet/kismet_featureset.hpp \ - ../plugins/input/kismet/kismet_types.hpp \ - ../plugins/input/occi/occi_datasource.hpp \ - ../plugins/input/occi/occi_featureset.hpp \ - ../plugins/input/occi/occi_types.hpp \ - ../plugins/input/occi/spatial_classesh.h \ - ../plugins/input/occi/spatial_classesm.h \ - ../plugins/input/ogr/ogr_converter.hpp \ - ../plugins/input/ogr/ogr_datasource.hpp \ - ../plugins/input/ogr/ogr_featureset.hpp \ - ../plugins/input/ogr/ogr_index.hpp \ - ../plugins/input/ogr/ogr_index_featureset.hpp \ - ../plugins/input/ogr/ogr_layer_ptr.hpp \ - ../plugins/input/osm/basiccurl.h \ - ../plugins/input/osm/dataset_deliverer.h \ - ../plugins/input/osm/osm.h \ - ../plugins/input/osm/osm_datasource.hpp \ - ../plugins/input/osm/osm_featureset.hpp \ - ../plugins/input/osm/osmparser.h \ - ../plugins/input/osm/osmtagtypes.h \ - ../plugins/input/postgis/connection.hpp \ - ../plugins/input/postgis/connection_manager.hpp \ - ../plugins/input/postgis/cursorresultset.hpp \ - ../plugins/input/postgis/postgis_datasource.hpp \ - ../plugins/input/postgis/postgis_featureset.hpp \ - ../plugins/input/postgis/resultset.hpp \ - ../plugins/input/python/python_datasource.hpp \ - ../plugins/input/python/python_featureset.hpp \ - ../plugins/input/python/python_utils.hpp \ - ../plugins/input/raster/raster_datasource.hpp \ - ../plugins/input/raster/raster_featureset.hpp \ - ../plugins/input/raster/raster_info.hpp \ - ../plugins/input/rasterlite/rasterlite_datasource.hpp \ - ../plugins/input/rasterlite/rasterlite_featureset.hpp \ - ../plugins/input/rasterlite/rasterlite_include.hpp \ - ../plugins/input/shape/dbfile.hpp \ - ../plugins/input/shape/shape_datasource.hpp \ - ../plugins/input/shape/shape_featureset.hpp \ - ../plugins/input/shape/shape_index_featureset.hpp \ - ../plugins/input/shape/shape_io.hpp \ - ../plugins/input/shape/shape_utils.hpp \ - ../plugins/input/shape/shapefile.hpp \ - ../plugins/input/shape/shp_index.hpp \ - ../plugins/input/sqlite/sqlite_connection.hpp \ - ../plugins/input/sqlite/sqlite_datasource.hpp \ - ../plugins/input/sqlite/sqlite_featureset.hpp \ - ../plugins/input/sqlite/sqlite_prepared.hpp \ - ../plugins/input/sqlite/sqlite_resultset.hpp \ - ../plugins/input/sqlite/sqlite_utils.hpp \ - ../plugins/input/templates/helloworld/hello_datasource.hpp \ - ../plugins/input/templates/helloworld/hello_featureset.hpp \ - - -SOURCES += \ - ../bindings/python/mapnik_building_symbolizer.cpp \ - ../bindings/python/mapnik_color.cpp \ - ../bindings/python/mapnik_coord.cpp \ - ../bindings/python/mapnik_datasource.cpp \ - ../bindings/python/mapnik_datasource_cache.cpp \ - ../bindings/python/mapnik_envelope.cpp \ - ../bindings/python/mapnik_expression.cpp \ - ../bindings/python/mapnik_feature.cpp \ - ../bindings/python/mapnik_featureset.cpp \ - ../bindings/python/mapnik_font_engine.cpp \ - ../bindings/python/mapnik_fontset.cpp \ - ../bindings/python/mapnik_gamma_method.cpp \ - ../bindings/python/mapnik_geometry.cpp \ - ../bindings/python/mapnik_grid.cpp \ - ../bindings/python/mapnik_grid_view.cpp \ - ../bindings/python/mapnik_image.cpp \ - ../bindings/python/mapnik_image_view.cpp \ - ../bindings/python/mapnik_label_collision_detector.cpp \ - ../bindings/python/mapnik_layer.cpp \ - ../bindings/python/mapnik_line_pattern_symbolizer.cpp \ - ../bindings/python/mapnik_line_symbolizer.cpp \ - ../bindings/python/mapnik_logger.cpp \ - ../bindings/python/mapnik_map.cpp \ - ../bindings/python/mapnik_markers_symbolizer.cpp \ - ../bindings/python/mapnik_palette.cpp \ - ../bindings/python/mapnik_parameters.cpp \ - ../bindings/python/mapnik_point_symbolizer.cpp \ - ../bindings/python/mapnik_polygon_pattern_symbolizer.cpp \ - ../bindings/python/mapnik_polygon_symbolizer.cpp \ - ../bindings/python/mapnik_proj_transform.cpp \ - ../bindings/python/mapnik_projection.cpp \ - ../bindings/python/mapnik_python.cpp \ - ../bindings/python/mapnik_query.cpp \ - ../bindings/python/mapnik_raster_colorizer.cpp \ - ../bindings/python/mapnik_raster_symbolizer.cpp \ - ../bindings/python/mapnik_rule.cpp \ - ../bindings/python/mapnik_scaling_method.cpp \ - ../bindings/python/mapnik_shield_symbolizer.cpp \ - ../bindings/python/mapnik_stroke.cpp \ - ../bindings/python/mapnik_style.cpp \ - ../bindings/python/mapnik_symbolizer.cpp \ - ../bindings/python/mapnik_text_placement.cpp \ - ../bindings/python/mapnik_view_transform.cpp \ - ../bindings/python/python_cairo.cpp \ - ../bindings/python/python_grid_utils.cpp \ - ../deps/agg/src/agg_arc.cpp \ - ../deps/agg/src/agg_arrowhead.cpp \ - ../deps/agg/src/agg_bezier_arc.cpp \ - ../deps/agg/src/agg_bspline.cpp \ - ../deps/agg/src/agg_curves.cpp \ - ../deps/agg/src/agg_embedded_raster_fonts.cpp \ - ../deps/agg/src/agg_gsv_text.cpp \ - ../deps/agg/src/agg_image_filters.cpp \ - ../deps/agg/src/agg_line_aa_basics.cpp \ - ../deps/agg/src/agg_line_profile_aa.cpp \ - ../deps/agg/src/agg_pixfmt_rgba.cpp \ - ../deps/agg/src/agg_rounded_rect.cpp \ - ../deps/agg/src/agg_sqrt_tables.cpp \ - ../deps/agg/src/agg_trans_affine.cpp \ - ../deps/agg/src/agg_trans_double_path.cpp \ - ../deps/agg/src/agg_trans_single_path.cpp \ - ../deps/agg/src/agg_trans_warp_magnifier.cpp \ - ../deps/agg/src/agg_vcgen_bspline.cpp \ - ../deps/agg/src/agg_vcgen_contour.cpp \ - ../deps/agg/src/agg_vcgen_dash.cpp \ - ../deps/agg/src/agg_vcgen_markers_term.cpp \ - ../deps/agg/src/agg_vcgen_smooth_poly1.cpp \ - ../deps/agg/src/agg_vcgen_stroke.cpp \ - ../deps/agg/src/agg_vpgen_clip_polygon.cpp \ - ../deps/agg/src/agg_vpgen_clip_polyline.cpp \ - ../deps/agg/src/agg_vpgen_segmentator.cpp \ - ../plugins/input/csv/csv_datasource.cpp \ - ../plugins/input/gdal/gdal_datasource.cpp \ - ../plugins/input/gdal/gdal_featureset.cpp \ - ../plugins/input/geojson/geojson_datasource.cpp \ - ../plugins/input/geojson/geojson_featureset.cpp \ - ../plugins/input/geos/geos_datasource.cpp \ - ../plugins/input/geos/geos_featureset.cpp \ - ../plugins/input/kismet/kismet_datasource.cpp \ - ../plugins/input/kismet/kismet_featureset.cpp \ - ../plugins/input/occi/occi_datasource.cpp \ - ../plugins/input/occi/occi_featureset.cpp \ - ../plugins/input/occi/occi_types.cpp \ - ../plugins/input/occi/spatial_classesm.cpp \ - ../plugins/input/occi/spatial_classeso.cpp \ - ../plugins/input/ogr/ogr_converter.cpp \ - ../plugins/input/ogr/ogr_datasource.cpp \ - ../plugins/input/ogr/ogr_featureset.cpp \ - ../plugins/input/ogr/ogr_index_featureset.cpp \ - ../plugins/input/osm/basiccurl.cpp \ - ../plugins/input/osm/dataset_deliverer.cpp \ - ../plugins/input/osm/osm.cpp \ - ../plugins/input/osm/osm_datasource.cpp \ - ../plugins/input/osm/osm_featureset.cpp \ - ../plugins/input/osm/osmparser.cpp \ - ../plugins/input/osm/render.cpp \ - ../plugins/input/osm/test.cpp \ - ../plugins/input/postgis/postgis_datasource.cpp \ - ../plugins/input/postgis/postgis_featureset.cpp \ - ../plugins/input/python/python_datasource.cpp \ - ../plugins/input/python/python_featureset.cpp \ - ../plugins/input/python/python_utils.cpp \ - ../plugins/input/raster/raster_datasource.cpp \ - ../plugins/input/raster/raster_featureset.cpp \ - ../plugins/input/raster/raster_info.cpp \ - ../plugins/input/rasterlite/rasterlite_datasource.cpp \ - ../plugins/input/rasterlite/rasterlite_featureset.cpp \ - ../plugins/input/shape/dbf_test.cpp \ - ../plugins/input/shape/dbfile.cpp \ - ../plugins/input/shape/shape_datasource.cpp \ - ../plugins/input/shape/shape_featureset.cpp \ - ../plugins/input/shape/shape_index_featureset.cpp \ - ../plugins/input/shape/shape_io.cpp \ - ../plugins/input/shape/shape_utils.cpp \ - ../plugins/input/sqlite/sqlite_datasource.cpp \ - ../plugins/input/sqlite/sqlite_featureset.cpp \ - ../plugins/input/templates/helloworld/hello_datasource.cpp \ - ../plugins/input/templates/helloworld/hello_featureset.cpp \ - ../src/agg/agg_renderer.cpp \ - ../src/agg/agg_renderer.cpp \ - ../src/agg/process_building_symbolizer.cpp \ - ../src/agg/process_building_symbolizer.cpp \ - ../src/agg/process_debug_symbolizer.cpp \ - ../src/agg/process_debug_symbolizer.cpp \ - ../src/agg/process_line_pattern_symbolizer.cpp \ - ../src/agg/process_line_pattern_symbolizer.cpp \ - ../src/agg/process_line_symbolizer.cpp \ - ../src/agg/process_line_symbolizer.cpp \ - ../src/agg/process_markers_symbolizer.cpp \ - ../src/agg/process_markers_symbolizer.cpp \ - ../src/agg/process_point_symbolizer.cpp \ - ../src/agg/process_point_symbolizer.cpp \ - ../src/agg/process_polygon_pattern_symbolizer.cpp \ - ../src/agg/process_polygon_pattern_symbolizer.cpp \ - ../src/agg/process_polygon_symbolizer.cpp \ - ../src/agg/process_polygon_symbolizer.cpp \ - ../src/agg/process_raster_symbolizer.cpp \ - ../src/agg/process_raster_symbolizer.cpp \ - ../src/agg/process_shield_symbolizer.cpp \ - ../src/agg/process_shield_symbolizer.cpp \ - ../src/agg/process_text_symbolizer.cpp \ - ../src/agg/process_text_symbolizer.cpp \ - ../src/box2d.cpp \ - ../src/box2d.cpp \ - ../src/building_symbolizer.cpp \ - ../src/building_symbolizer.cpp \ - ../src/cairo_context.cpp \ - ../src/cairo_context.cpp \ - ../src/cairo_renderer.cpp \ - ../src/cairo_renderer.cpp \ - ../src/color.cpp \ - ../src/color.cpp \ - ../src/color_factory.cpp \ - ../src/color_factory.cpp \ - ../src/config_error.cpp \ - ../src/config_error.cpp \ - ../src/conversions.cpp \ - ../src/conversions.cpp \ - ../src/css_color_grammar.cpp \ - ../src/css_color_grammar.cpp \ - ../src/datasource_cache.cpp \ - ../src/datasource_cache.cpp \ - ../src/debug.cpp \ - ../src/debug.cpp \ - ../src/deepcopy.cpp \ - ../src/deepcopy.cpp \ - ../src/distance.cpp \ - ../src/distance.cpp \ - ../src/expression.cpp \ - ../src/expression.cpp \ - ../src/expression_grammar.cpp \ - ../src/expression_grammar.cpp \ - ../src/expression_node.cpp \ - ../src/expression_node.cpp \ - ../src/expression_string.cpp \ - ../src/expression_string.cpp \ - ../src/feature_kv_iterator.cpp \ - ../src/feature_kv_iterator.cpp \ - ../src/feature_style_processor.cpp \ - ../src/feature_style_processor.cpp \ - ../src/feature_type_style.cpp \ - ../src/feature_type_style.cpp \ - ../src/font_engine_freetype.cpp \ - ../src/font_engine_freetype.cpp \ - ../src/font_set.cpp \ - ../src/font_set.cpp \ - ../src/formatting/base.cpp \ - ../src/formatting/base.cpp \ - ../src/formatting/expression.cpp \ - ../src/formatting/expression.cpp \ - ../src/formatting/format.cpp \ - ../src/formatting/format.cpp \ - ../src/formatting/list.cpp \ - ../src/formatting/list.cpp \ - ../src/formatting/registry.cpp \ - ../src/formatting/registry.cpp \ - ../src/formatting/text.cpp \ - ../src/formatting/text.cpp \ - ../src/gamma_method.cpp \ - ../src/gamma_method.cpp \ - ../src/gradient.cpp \ - ../src/gradient.cpp \ - ../src/graphics.cpp \ - ../src/graphics.cpp \ - ../src/grid/grid.cpp \ - ../src/grid/grid.cpp \ - ../src/grid/grid_renderer.cpp \ - ../src/grid/grid_renderer.cpp \ - ../src/grid/process_building_symbolizer.cpp \ - ../src/grid/process_building_symbolizer.cpp \ - ../src/grid/process_line_pattern_symbolizer.cpp \ - ../src/grid/process_line_pattern_symbolizer.cpp \ - ../src/grid/process_line_symbolizer.cpp \ - ../src/grid/process_line_symbolizer.cpp \ - ../src/grid/process_markers_symbolizer.cpp \ - ../src/grid/process_markers_symbolizer.cpp \ - ../src/grid/process_point_symbolizer.cpp \ - ../src/grid/process_point_symbolizer.cpp \ - ../src/grid/process_polygon_pattern_symbolizer.cpp \ - ../src/grid/process_polygon_pattern_symbolizer.cpp \ - ../src/grid/process_polygon_symbolizer.cpp \ - ../src/grid/process_polygon_symbolizer.cpp \ - ../src/grid/process_raster_symbolizer.cpp \ - ../src/grid/process_raster_symbolizer.cpp \ - ../src/grid/process_shield_symbolizer.cpp \ - ../src/grid/process_shield_symbolizer.cpp \ - ../src/grid/process_text_symbolizer.cpp \ - ../src/grid/process_text_symbolizer.cpp \ - ../src/image_compositing.cpp \ - ../src/image_compositing.cpp \ - ../src/image_filter_grammar.cpp \ - ../src/image_filter_grammar.cpp \ - ../src/image_filter_types.cpp \ - ../src/image_filter_types.cpp \ - ../src/image_reader.cpp \ - ../src/image_reader.cpp \ - ../src/image_scaling.cpp \ - ../src/image_scaling.cpp \ - ../src/image_util.cpp \ - ../src/image_util.cpp \ - ../src/jpeg_reader.cpp \ - ../src/jpeg_reader.cpp \ - ../src/json/feature_collection_parser.cpp \ - ../src/json/feature_collection_parser.cpp \ - ../src/json/feature_grammar.cpp \ - ../src/json/feature_grammar.cpp \ - ../src/json/geojson_generator.cpp \ - ../src/json/geojson_generator.cpp \ - ../src/json/geometry_grammar.cpp \ - ../src/json/geometry_grammar.cpp \ - ../src/json/geometry_parser.cpp \ - ../src/json/geometry_parser.cpp \ - ../src/layer.cpp \ - ../src/layer.cpp \ - ../src/libxml2_loader.cpp \ - ../src/libxml2_loader.cpp \ - ../src/line_pattern_symbolizer.cpp \ - ../src/line_pattern_symbolizer.cpp \ - ../src/line_symbolizer.cpp \ - ../src/line_symbolizer.cpp \ - ../src/load_map.cpp \ - ../src/load_map.cpp \ - ../src/map.cpp \ - ../src/map.cpp \ - ../src/mapped_memory_cache.cpp \ - ../src/mapped_memory_cache.cpp \ - ../src/marker_cache.cpp \ - ../src/marker_cache.cpp \ - ../src/markers_symbolizer.cpp \ - ../src/markers_symbolizer.cpp \ - ../src/memory.cpp \ - ../src/memory.cpp \ - ../src/memory_datasource.cpp \ - ../src/memory_datasource.cpp \ - ../src/miniz.c \ - ../src/miniz.c \ - ../src/miniz_png.cpp \ - ../src/miniz_png.cpp \ - ../src/palette.cpp \ - ../src/palette.cpp \ - ../src/params.cpp \ - ../src/params.cpp \ - ../src/parse_path.cpp \ - ../src/parse_path.cpp \ - ../src/parse_transform.cpp \ - ../src/parse_transform.cpp \ - ../src/path_expression_grammar.cpp \ - ../src/path_expression_grammar.cpp \ - ../src/placement_finder.cpp \ - ../src/placement_finder.cpp \ - ../src/plugin.cpp \ - ../src/plugin.cpp \ - ../src/png_reader.cpp \ - ../src/png_reader.cpp \ - ../src/point_symbolizer.cpp \ - ../src/point_symbolizer.cpp \ - ../src/polygon_pattern_symbolizer.cpp \ - ../src/polygon_pattern_symbolizer.cpp \ - ../src/polygon_symbolizer.cpp \ - ../src/polygon_symbolizer.cpp \ - ../src/processed_text.cpp \ - ../src/processed_text.cpp \ - ../src/proj_transform.cpp \ - ../src/proj_transform.cpp \ - ../src/projection.cpp \ - ../src/projection.cpp \ - ../src/rapidxml_loader.cpp \ - ../src/rapidxml_loader.cpp \ - ../src/raster_colorizer.cpp \ - ../src/raster_colorizer.cpp \ - ../src/raster_symbolizer.cpp \ - ../src/raster_symbolizer.cpp \ - ../src/rule.cpp \ - ../src/rule.cpp \ - ../src/save_map.cpp \ - ../src/save_map.cpp \ - ../src/scale_denominator.cpp \ - ../src/scale_denominator.cpp \ - ../src/shield_symbolizer.cpp \ - ../src/shield_symbolizer.cpp \ - ../src/simplify.cpp \ - ../src/simplify.cpp \ - ../src/stroke.cpp \ - ../src/stroke.cpp \ - ../src/svg/output/process_building_symbolizer.cpp \ - ../src/svg/output/process_building_symbolizer.cpp \ - ../src/svg/output/process_line_pattern_symbolizer.cpp \ - ../src/svg/output/process_line_pattern_symbolizer.cpp \ - ../src/svg/output/process_line_symbolizer.cpp \ - ../src/svg/output/process_line_symbolizer.cpp \ - ../src/svg/output/process_markers_symbolizer.cpp \ - ../src/svg/output/process_markers_symbolizer.cpp \ - ../src/svg/output/process_point_symbolizer.cpp \ - ../src/svg/output/process_point_symbolizer.cpp \ - ../src/svg/output/process_polygon_pattern_symbolizer.cpp \ - ../src/svg/output/process_polygon_pattern_symbolizer.cpp \ - ../src/svg/output/process_polygon_symbolizer.cpp \ - ../src/svg/output/process_polygon_symbolizer.cpp \ - ../src/svg/output/process_raster_symbolizer.cpp \ - ../src/svg/output/process_raster_symbolizer.cpp \ - ../src/svg/output/process_shield_symbolizer.cpp \ - ../src/svg/output/process_shield_symbolizer.cpp \ - ../src/svg/output/process_symbolizers.cpp \ - ../src/svg/output/process_symbolizers.cpp \ - ../src/svg/output/process_text_symbolizer.cpp \ - ../src/svg/output/process_text_symbolizer.cpp \ - ../src/svg/output/svg_generator.cpp \ - ../src/svg/output/svg_generator.cpp \ - ../src/svg/output/svg_output_attributes.cpp \ - ../src/svg/output/svg_output_attributes.cpp \ - ../src/svg/output/svg_renderer.cpp \ - ../src/svg/output/svg_renderer.cpp \ - ../src/svg/svg_parser.cpp \ - ../src/svg/svg_parser.cpp \ - ../src/svg/svg_path_parser.cpp \ - ../src/svg/svg_path_parser.cpp \ - ../src/svg/svg_points_parser.cpp \ - ../src/svg/svg_points_parser.cpp \ - ../src/svg/svg_transform_parser.cpp \ - ../src/svg/svg_transform_parser.cpp \ - ../src/symbolizer.cpp \ - ../src/symbolizer.cpp \ - ../src/symbolizer_helpers.cpp \ - ../src/symbolizer_helpers.cpp \ - ../src/text_placements/base.cpp \ - ../src/text_placements/base.cpp \ - ../src/text_placements/dummy.cpp \ - ../src/text_placements/dummy.cpp \ - ../src/text_placements/list.cpp \ - ../src/text_placements/list.cpp \ - ../src/text_placements/registry.cpp \ - ../src/text_placements/registry.cpp \ - ../src/text_placements/simple.cpp \ - ../src/text_placements/simple.cpp \ - ../src/text_properties.cpp \ - ../src/text_properties.cpp \ - ../src/text_symbolizer.cpp \ - ../src/text_symbolizer.cpp \ - ../src/tiff_reader.cpp \ - ../src/tiff_reader.cpp \ - ../src/transform_expression.cpp \ - ../src/transform_expression.cpp \ - ../src/transform_expression_grammar.cpp \ - ../src/transform_expression_grammar.cpp \ - ../src/unicode.cpp \ - ../src/unicode.cpp \ - ../src/warp.cpp \ - ../src/warp.cpp \ - ../src/well_known_srs.cpp \ - ../src/well_known_srs.cpp \ - ../src/wkb.cpp \ - ../src/wkb.cpp \ - ../src/wkt/wkt_factory.cpp \ - ../src/wkt/wkt_factory.cpp \ - ../src/wkt/wkt_generator.cpp \ - ../src/wkt/wkt_generator.cpp \ - ../src/xml_tree.cpp \ - ../src/xml_tree.cpp \ - -